[gnome-commander/gcmd-1-3] Use new profile widget in advrename dialog



commit 839cb769855cbf1f2ecb6ae4bb471f7422695e83
Author: Piotr Eljasiak <epiotr src gnome org>
Date:   Tue May 19 00:21:56 2009 +0200

    Use new profile widget in advrename dialog
---
 ChangeLog                         |    6 +
 src/gnome-cmd-advrename-dialog.cc | 1130 ++++---------------------------------
 src/gnome-cmd-advrename-dialog.h  |    1 -
 3 files changed, 109 insertions(+), 1028 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cbea103..e704f30 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-05-19  Piotr Eljasiak  <epiotr use pl>
+
+	* src/gnome-cmd-advrename-dialog.cc:
+	* src/gnome-cmd-advrename-dialog.h:
+	 Use new profile widget in advrename dialog
+
 2009-05-18  Christopher Zimmermann  <madroach zakweb de>
 
 	* src/gnome-cmd-data.cc:
diff --git a/src/gnome-cmd-advrename-dialog.cc b/src/gnome-cmd-advrename-dialog.cc
index dcdbf89..57138f7 100644
--- a/src/gnome-cmd-advrename-dialog.cc
+++ b/src/gnome-cmd-advrename-dialog.cc
@@ -28,6 +28,7 @@
 #include "gnome-cmd-includes.h"
 #include "gnome-cmd-convert.h"
 #include "gnome-cmd-advrename-dialog.h"
+#include "gnome-cmd-profile-component.h"
 #include "dialogs/gnome-cmd-advrename-profiles-dialog.h"
 #include "dialogs/gnome-cmd-advrename-regex-dialog.h"
 #include "gnome-cmd-advrename-lexer.h"
@@ -49,77 +50,29 @@ struct GnomeCmdAdvrenameDialogClass
 
 struct GnomeCmdAdvrenameDialog::Private
 {
-    GnomeCmdConvertFunc convert_case;
-    GnomeCmdConvertFunc trim_blanks;
-
-    GtkWidget *template_combo;
-    GtkWidget *template_entry;
-
     gboolean template_has_counters;
 
-    GtkWidget *counter_start_spin;
-    GtkWidget *counter_step_spin;
-    GtkWidget *counter_digits_spin;
-
-    GtkTreeModel *regexes;
-    GtkWidget *regex_view;
-
-    GtkWidget *regex_add_button;
-    GtkWidget *regex_edit_button;
-    GtkWidget *regex_remove_button;
-    GtkWidget *regex_remove_all_button;
-
-    GtkWidget *case_combo;
-    GtkWidget *trim_combo;
-
+    GtkWidget *vbox;
+    GnomeCmdProfileComponent *profile_component;
     GtkWidget *files_view;
-
-    enum {DIR_MENU, FILE_MENU, COUNTER_MENU, DATE_MENU, METATAG_MENU, PROFILE_MENU, NUM_MENUS};
-
-    GtkWidget *menu_button[NUM_MENUS];
-
-    static GtkItemFactoryEntry dir_items[];
-    static GtkItemFactoryEntry name_items[];
-    static GtkItemFactoryEntry counter_items[];
-    static GtkItemFactoryEntry date_items[];
-    static GtkItemFactoryEntry *items[];
-    static GnomeCmdTag metatags[];
+    GtkWidget *profile_menu_button;
 
     Private();
     ~Private();
 
-    void fill_regex_model(const GnomeCmdData::AdvrenameConfig::Profile &profile);
-
     static gchar *translate_menu (const gchar *path, gpointer data);
 
-    GtkWidget *create_placeholder_menu(int menu_type, GnomeCmdData::AdvrenameConfig *cfg);
-    GtkWidget *create_button_with_menu(gchar *label_text, int menu_type, GnomeCmdData::AdvrenameConfig *cfg=NULL);
-    void insert_tag(const gchar *text);
-
-    static void insert_text_tag(GnomeCmdAdvrenameDialog::Private *priv, guint n, GtkWidget *widget);
-    static void insert_num_tag(GnomeCmdAdvrenameDialog::Private *priv, guint tag, GtkWidget *widget);
+    GtkWidget *create_placeholder_menu(GnomeCmdData::AdvrenameConfig *cfg);
+    GtkWidget *create_button_with_menu(gchar *label_text, GnomeCmdData::AdvrenameConfig *cfg=NULL);
 
     static void manage_profiles(GnomeCmdAdvrenameDialog::Private *priv, guint unused, GtkWidget *menu);
     static void load_profile(GnomeCmdAdvrenameDialog::Private *priv, guint profile_idx, GtkWidget *menu);
 
     void files_view_popup_menu (GtkWidget *treeview, GnomeCmdAdvrenameDialog *dialog, GdkEventButton *event=NULL);
 
-    static void on_template_entry_changed(GtkEntry *entry, GnomeCmdAdvrenameDialog *dialog);
-
-    static void on_counter_start_spin_value_changed (GtkWidget *spin, GnomeCmdAdvrenameDialog *dialog);
-    static void on_counter_step_spin_value_changed (GtkWidget *spin, GnomeCmdAdvrenameDialog *dialog);
-    static void on_counter_digits_spin_value_changed (GtkWidget *spin, GnomeCmdAdvrenameDialog *dialog);
-
-    static void on_regex_model_row_deleted (GtkTreeModel *treemodel, GtkTreePath *path, GnomeCmdAdvrenameDialog *dialog);
-    static void on_regex_add_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog);
-    static void on_regex_edit_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog);
-    static void on_regex_remove_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog);
-    static void on_regex_remove_all_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog);
-    static void on_regex_view_row_activated (GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, GnomeCmdAdvrenameDialog *dialog);
-
-    static void on_case_combo_changed (GtkComboBox *combo, GnomeCmdAdvrenameDialog *dialog);
-    static void on_trim_combo_changed (GtkComboBox *combo, GnomeCmdAdvrenameDialog *dialog);
-
+    static void on_profile_template_changed (GnomeCmdProfileComponent *component, GnomeCmdAdvrenameDialog *dialog);
+    static void on_profile_counter_changed (GnomeCmdProfileComponent *component, GnomeCmdAdvrenameDialog *dialog);
+    static void on_profile_regex_changed (GnomeCmdProfileComponent *component, GnomeCmdAdvrenameDialog *dialog);
     static void on_files_model_row_deleted (GtkTreeModel *files, GtkTreePath *path, GnomeCmdAdvrenameDialog *dialog);
     static void on_files_view_popup_menu__remove (GtkWidget *menuitem, GtkTreeView *treeview);
     static void on_files_view_popup_menu__view_file (GtkWidget *menuitem, GtkTreeView *treeview);
@@ -135,252 +88,15 @@ struct GnomeCmdAdvrenameDialog::Private
 };
 
 
-GtkItemFactoryEntry GnomeCmdAdvrenameDialog::Private::dir_items[] =
-    {{N_("/Grandparent"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 0},
-     {N_("/Parent"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 1}};
-
-GtkItemFactoryEntry GnomeCmdAdvrenameDialog::Private::name_items[] =
-    {{N_("/File name"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 2},
-     {N_("/File name without extension"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 3},
-     {N_("/File extension"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 4}};
-
-GtkItemFactoryEntry GnomeCmdAdvrenameDialog::Private::counter_items[] =
-    {{N_("/Counter"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 5},
-     {N_("/Counter (width)"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 6},
-     {N_("/Hexadecimal random number (width)"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 7}};
-
-GtkItemFactoryEntry GnomeCmdAdvrenameDialog::Private::date_items[] =
-    {{N_("/Date"), NULL, NULL, 0, "<Branch>"},
-     {N_("/Date/<locale>"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 8},
-     {N_("/Date/yyyy-mm-dd"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 9},
-     {N_("/Date/yy-mm-dd"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 10},
-     {N_("/Date/yy.mm.dd"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 11},
-     {N_("/Date/yymmdd"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 12},
-     {N_("/Date/dd.mm.yy"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 13},
-     {N_("/Date/mm-dd-yy"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 14},
-     {N_("/Date/yyyy"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 15},
-     {N_("/Date/yy"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 16},
-     {N_("/Date/mm"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 17},
-     {N_("/Date/mmm"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 18},
-     {N_("/Date/dd"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 19},
-     {N_("/Time"), NULL, NULL, 0, "<Branch>"},
-     {N_("/Time/<locale>"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 20},
-     {N_("/Time/HH.MM.SS"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 21},
-     {N_("/Time/HH-MM-SS"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 22},
-     {N_("/Time/HHMMSS"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 23},
-     {N_("/Time/HH"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 24},
-     {N_("/Time/MM"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 25},
-     {N_("/Time/SS"), NULL, (GtkItemFactoryCallback) GnomeCmdAdvrenameDialog::Private::insert_text_tag, 26}};
-
-GtkItemFactoryEntry *GnomeCmdAdvrenameDialog::Private::items[] = {dir_items, name_items, counter_items, date_items};
-
-GnomeCmdTag GnomeCmdAdvrenameDialog::Private::metatags[] =
-    {TAG_FILE_NAME, TAG_FILE_PATH,
-     TAG_FILE_LINK,
-     TAG_FILE_SIZE,
-     TAG_FILE_MODIFIED, TAG_FILE_ACCESSED,
-     TAG_FILE_PERMISSIONS,
-     TAG_FILE_FORMAT,
-     TAG_FILE_PUBLISHER, TAG_FILE_DESCRIPTION, TAG_FILE_KEYWORDS, TAG_FILE_RANK,
-
-     TAG_AUDIO_ALBUMARTIST, TAG_AUDIO_ALBUMGAIN, TAG_AUDIO_ALBUMPEAKGAIN,
-     TAG_AUDIO_ALBUMTRACKCOUNT, TAG_AUDIO_ALBUM, TAG_AUDIO_ARTIST, TAG_AUDIO_BITRATE,
-     TAG_AUDIO_CHANNELS, TAG_AUDIO_CODECVERSION, TAG_AUDIO_CODEC, TAG_AUDIO_COMMENT,
-     TAG_AUDIO_COVERALBUMTHUMBNAILPATH, TAG_AUDIO_DISCNO,
-     TAG_AUDIO_DURATION, TAG_AUDIO_DURATIONMMSS,
-     TAG_AUDIO_GENRE, TAG_AUDIO_ISNEW, TAG_AUDIO_ISRC, TAG_AUDIO_LASTPLAY, TAG_AUDIO_LYRICS,
-     TAG_AUDIO_MBALBUMARTISTID, TAG_AUDIO_MBALBUMID, TAG_AUDIO_MBARTISTID,
-     TAG_AUDIO_MBTRACKID, TAG_AUDIO_PERFORMER, TAG_AUDIO_PLAYCOUNT,
-     TAG_AUDIO_RELEASEDATE, TAG_AUDIO_SAMPLERATE, TAG_AUDIO_TITLE, TAG_AUDIO_TRACKGAIN,
-     TAG_AUDIO_TRACKNO, TAG_AUDIO_TRACKPEAKGAIN, TAG_AUDIO_YEAR,
-     TAG_AUDIO_MPEG_CHANNELMODE, TAG_AUDIO_MPEG_LAYER, TAG_AUDIO_MPEG_VERSION,
-
-     TAG_DOC_AUTHOR, TAG_DOC_CREATOR, TAG_DOC_TITLE,
-     TAG_DOC_SUBJECT, TAG_DOC_DESCRIPTION,
-     TAG_DOC_CATEGORY, TAG_DOC_KEYWORDS, TAG_DOC_REVISIONCOUNT,
-     TAG_DOC_PAGECOUNT, TAG_DOC_PARAGRAPHCOUNT, TAG_DOC_LINECOUNT,
-     TAG_DOC_WORDCOUNT, TAG_DOC_BYTECOUNT,
-     TAG_DOC_CELLCOUNT, TAG_DOC_CHARACTERCOUNT,
-     TAG_DOC_CODEPAGE, TAG_DOC_COMMENTS, TAG_DOC_COMPANY,
-     TAG_DOC_DATECREATED, TAG_DOC_DATEMODIFIED,
-     TAG_DOC_DICTIONARY,
-     TAG_DOC_EDITINGDURATION, TAG_DOC_GENERATOR,
-     TAG_DOC_HIDDENSLIDECOUNT,
-     TAG_DOC_IMAGECOUNT, TAG_DOC_INITIALCREATOR,
-     TAG_DOC_LANGUAGE,
-     TAG_DOC_LASTPRINTED, TAG_DOC_LASTSAVEDBY,
-     TAG_DOC_LOCALESYSTEMDEFAULT, TAG_DOC_MMCLIPCOUNT,
-     TAG_DOC_MANAGER, TAG_DOC_NOTECOUNT, TAG_DOC_OBJECTCOUNT,
-     TAG_DOC_PRESENTATIONFORMAT, TAG_DOC_PRINTDATE,
-     TAG_DOC_PRINTEDBY, TAG_DOC_SCALE, TAG_DOC_SECURITY,
-     TAG_DOC_SLIDECOUNT, TAG_DOC_SPREADSHEETCOUNT,
-     TAG_DOC_TABLECOUNT, TAG_DOC_TEMPLATE,
-     TAG_DOC_CASESENSITIVE, TAG_DOC_LINKSDIRTY,
-
-     TAG_IMAGE_ALBUM, TAG_IMAGE_MAKE, TAG_IMAGE_MODEL,
-     TAG_IMAGE_COMMENTS, TAG_IMAGE_COPYRIGHT, TAG_IMAGE_CREATOR,
-     TAG_IMAGE_DATE, TAG_IMAGE_DESCRIPTION, TAG_IMAGE_EXPOSUREPROGRAM,
-     TAG_IMAGE_EXPOSURETIME, TAG_IMAGE_FLASH, TAG_IMAGE_FNUMBER,
-     TAG_IMAGE_FOCALLENGTH, TAG_IMAGE_HEIGHT, TAG_IMAGE_ISOSPEED,
-     TAG_IMAGE_KEYWORDS, TAG_IMAGE_METERINGMODE, TAG_IMAGE_ORIENTATION,
-     TAG_IMAGE_SOFTWARE, TAG_IMAGE_TITLE, TAG_IMAGE_WHITEBALANCE,
-     TAG_IMAGE_WIDTH,
-
-     TAG_NONE,
-
-     TAG_ID3_BAND,
-     TAG_ID3_CONTENTTYPE,
-     TAG_ID3_ALBUMSORTORDER, TAG_ID3_AUDIOCRYPTO,
-     TAG_ID3_AUDIOSEEKPOINT,
-     TAG_ID3_BPM, TAG_ID3_BUFFERSIZE, TAG_ID3_CDID,
-     TAG_ID3_COMMERCIAL, TAG_ID3_COMPOSER, TAG_ID3_CONDUCTOR,
-     TAG_ID3_CONTENTGROUP, TAG_ID3_CONTENTTYPE,
-     TAG_ID3_COPYRIGHT,
-     TAG_ID3_CRYPTOREG, TAG_ID3_DATE,
-     TAG_ID3_EMPHASIS, TAG_ID3_ENCODEDBY,
-     TAG_ID3_ENCODERSETTINGS, TAG_ID3_ENCODINGTIME, TAG_ID3_EQUALIZATION,
-     TAG_ID3_EQUALIZATION2, TAG_ID3_EVENTTIMING, TAG_ID3_FILEOWNER,
-     TAG_ID3_FILETYPE, TAG_ID3_FRAMES, TAG_ID3_GENERALOBJECT,
-     TAG_ID3_GROUPINGREG, TAG_ID3_INITIALKEY,
-     TAG_ID3_INVOLVEDPEOPLE, TAG_ID3_INVOLVEDPEOPLE2,
-     TAG_ID3_LANGUAGE, TAG_ID3_LINKEDINFO,
-     TAG_ID3_LYRICIST, TAG_ID3_MEDIATYPE, TAG_ID3_MIXARTIST,
-     TAG_ID3_MOOD,
-     TAG_ID3_MPEGLOOKUP,
-     TAG_ID3_MUSICIANCREDITLIST,
-     TAG_ID3_NETRADIOOWNER, TAG_ID3_NETRADIOSTATION,
-     TAG_ID3_ORIGALBUM, TAG_ID3_ORIGARTIST, TAG_ID3_ORIGFILENAME,
-     TAG_ID3_ORIGLYRICIST, TAG_ID3_ORIGRELEASETIME, TAG_ID3_ORIGYEAR,
-     TAG_ID3_OWNERSHIP, TAG_ID3_PARTINSET, TAG_ID3_PERFORMERSORTORDER,
-     TAG_ID3_PICTURE, TAG_ID3_PLAYCOUNTER, TAG_ID3_PLAYLISTDELAY,
-     TAG_ID3_POPULARIMETER, TAG_ID3_POSITIONSYNC, TAG_ID3_PRIVATE,
-     TAG_ID3_PRODUCEDNOTICE, TAG_ID3_PUBLISHER, TAG_ID3_RECORDINGDATES,
-     TAG_ID3_RECORDINGTIME, TAG_ID3_RELEASETIME, TAG_ID3_REVERB,
-     TAG_ID3_SETSUBTITLE, TAG_ID3_SIGNATURE,
-     TAG_ID3_SIZE, TAG_ID3_SONGLEN, TAG_ID3_SUBTITLE, TAG_ID3_SYNCEDLYRICS,
-     TAG_ID3_SYNCEDTEMPO, TAG_ID3_TAGGINGTIME, TAG_ID3_TERMSOFUSE,
-     TAG_ID3_TIME, TAG_ID3_TITLESORTORDER,
-     TAG_ID3_UNIQUEFILEID, TAG_ID3_UNSYNCEDLYRICS, TAG_ID3_USERTEXT,
-     TAG_ID3_VOLUMEADJ, TAG_ID3_VOLUMEADJ2, TAG_ID3_WWWARTIST,
-     TAG_ID3_WWWAUDIOFILE, TAG_ID3_WWWAUDIOSOURCE, TAG_ID3_WWWCOMMERCIALINFO,
-     TAG_ID3_WWWCOPYRIGHT, TAG_ID3_WWWPAYMENT, TAG_ID3_WWWPUBLISHER,
-     TAG_ID3_WWWRADIOPAGE, TAG_ID3_WWWUSER,
-
-     TAG_VORBIS_CONTACT, TAG_VORBIS_DESCRIPTION,
-     TAG_VORBIS_LICENSE, TAG_VORBIS_LOCATION,
-     TAG_VORBIS_MAXBITRATE, TAG_VORBIS_MINBITRATE,
-     TAG_VORBIS_NOMINALBITRATE, TAG_VORBIS_ORGANIZATION,
-     TAG_VORBIS_VENDOR, TAG_VORBIS_VERSION,
-
-     TAG_EXIF_COPYRIGHT, TAG_EXIF_DATETIME,
-     TAG_EXIF_EXPOSUREBIASVALUE, TAG_EXIF_EXPOSUREMODE, TAG_EXIF_EXPOSUREPROGRAM,
-     TAG_EXIF_FLASH, TAG_EXIF_FLASHENERGY,
-     TAG_EXIF_FNUMBER, TAG_EXIF_FOCALLENGTH,
-     TAG_EXIF_ISOSPEEDRATINGS, TAG_EXIF_MAXAPERTUREVALUE,
-     TAG_EXIF_METERINGMODE, TAG_EXIF_SHUTTERSPEEDVALUE, TAG_EXIF_WHITEBALANCE,
-     TAG_EXIF_PIXELXDIMENSION, TAG_EXIF_PIXELYDIMENSION,
-     TAG_EXIF_XRESOLUTION, TAG_EXIF_YRESOLUTION,
-     TAG_EXIF_IMAGELENGTH, TAG_EXIF_IMAGEWIDTH,
-     TAG_EXIF_CUSTOMRENDERED, TAG_EXIF_COLORSPACE,
-     TAG_EXIF_DOCUMENTNAME, TAG_EXIF_USERCOMMENT,
-
-     TAG_EXIF_APERTUREVALUE, TAG_EXIF_ARTIST, TAG_EXIF_BATTERYLEVEL,
-     TAG_EXIF_BITSPERSAMPLE, TAG_EXIF_BRIGHTNESSVALUE,
-     TAG_EXIF_CFAPATTERN, TAG_EXIF_COMPONENTSCONFIGURATION,
-     TAG_EXIF_COMPRESSEDBITSPERPIXEL, TAG_EXIF_COMPRESSION, TAG_EXIF_CONTRAST,
-     TAG_EXIF_DATETIMEDIGITIZED, TAG_EXIF_DATETIMEORIGINAL,
-     TAG_EXIF_DEVICESETTINGDESCRIPTION, TAG_EXIF_DIGITALZOOMRATIO,
-     TAG_EXIF_EXIFVERSION,
-     TAG_EXIF_EXPOSUREINDEX,
-     TAG_EXIF_EXPOSURETIME, TAG_EXIF_FILESOURCE,
-     TAG_EXIF_FILLORDER,
-     TAG_EXIF_FLASHPIXVERSION,
-     TAG_EXIF_FOCALLENGTHIN35MMFILM, TAG_EXIF_FOCALPLANERESOLUTIONUNIT,
-     TAG_EXIF_FOCALPLANEXRESOLUTION, TAG_EXIF_FOCALPLANEYRESOLUTION,
-     TAG_EXIF_GAINCONTROL, TAG_EXIF_GAMMA, TAG_EXIF_GPSALTITUDE,
-     TAG_EXIF_GPSLATITUDE, TAG_EXIF_GPSLONGITUDE,
-     TAG_EXIF_GPSVERSIONID, TAG_EXIF_IMAGEDESCRIPTION, TAG_EXIF_IMAGEUNIQUEID,
-     TAG_EXIF_INTERCOLORPROFILE, TAG_EXIF_INTEROPERABILITYINDEX, TAG_EXIF_INTEROPERABILITYVERSION,
-     TAG_EXIF_IPTCNAA, TAG_EXIF_JPEGINTERCHANGEFORMAT,
-     TAG_EXIF_JPEGINTERCHANGEFORMATLENGTH, TAG_EXIF_LIGHTSOURCE,
-     TAG_EXIF_MAKE, TAG_EXIF_MAKERNOTE,
-     TAG_EXIF_METERINGMODE, TAG_EXIF_MODEL, TAG_EXIF_NEWCFAPATTERN,
-     TAG_EXIF_NEWSUBFILETYPE, TAG_EXIF_OECF, TAG_EXIF_ORIENTATION,
-     TAG_EXIF_PHOTOMETRICINTERPRETATION, TAG_EXIF_PLANARCONFIGURATION,
-     TAG_EXIF_PRIMARYCHROMATICITIES, TAG_EXIF_REFERENCEBLACKWHITE,
-     TAG_EXIF_RELATEDIMAGEFILEFORMAT, TAG_EXIF_RELATEDIMAGELENGTH,
-     TAG_EXIF_RELATEDIMAGEWIDTH, TAG_EXIF_RELATEDSOUNDFILE, TAG_EXIF_RESOLUTIONUNIT,
-     TAG_EXIF_ROWSPERSTRIP, TAG_EXIF_SAMPLESPERPIXEL, TAG_EXIF_SATURATION,
-     TAG_EXIF_SCENECAPTURETYPE, TAG_EXIF_SCENETYPE, TAG_EXIF_SENSINGMETHOD,
-     TAG_EXIF_SHARPNESS, TAG_EXIF_SHUTTERSPEEDVALUE, TAG_EXIF_SOFTWARE,
-     TAG_EXIF_SPATIALFREQUENCYRESPONSE, TAG_EXIF_SPECTRALSENSITIVITY,
-     TAG_EXIF_STRIPBYTECOUNTS, TAG_EXIF_STRIPOFFSETS,
-     TAG_EXIF_SUBJECTAREA, TAG_EXIF_SUBJECTDISTANCE, TAG_EXIF_SUBJECTDISTANCERANGE,
-     TAG_EXIF_SUBJECTLOCATION, TAG_EXIF_SUBSECTIME, TAG_EXIF_SUBSECTIMEDIGITIZED,
-     TAG_EXIF_SUBSECTIMEORIGINAL, TAG_EXIF_TIFFEPSTANDARDID, TAG_EXIF_TRANSFERFUNCTION,
-     TAG_EXIF_TRANSFERRANGE, TAG_EXIF_WHITEPOINT,
-     TAG_EXIF_YCBCRCOEFFICIENTS, TAG_EXIF_YCBCRPOSITIONING,
-     TAG_EXIF_YCBCRSUBSAMPLING,
-
-     TAG_IPTC_BYLINE, TAG_IPTC_BYLINETITLE, TAG_IPTC_CAPTION, TAG_IPTC_HEADLINE,
-     TAG_IPTC_SUBLOCATION, TAG_IPTC_CITY, TAG_IPTC_PROVINCE,
-     TAG_IPTC_COUNTRYCODE, TAG_IPTC_COUNTRYNAME,
-     TAG_IPTC_CONTACT, TAG_IPTC_COPYRIGHTNOTICE, TAG_IPTC_CREDIT,
-     TAG_IPTC_KEYWORDS,
-     TAG_IPTC_DIGITALCREATIONDATE, TAG_IPTC_DIGITALCREATIONTIME,
-     TAG_IPTC_IMAGEORIENTATION,
-     TAG_IPTC_SPECIALINSTRUCTIONS, TAG_IPTC_URGENCY,
-
-     TAG_IPTC_ACTIONADVISED, TAG_IPTC_ARMID, TAG_IPTC_ARMVERSION,
-     TAG_IPTC_AUDIODURATION, TAG_IPTC_AUDIOOUTCUE, TAG_IPTC_AUDIOSAMPLINGRATE,
-     TAG_IPTC_AUDIOSAMPLINGRES, TAG_IPTC_AUDIOTYPE,
-     TAG_IPTC_CATEGORY, TAG_IPTC_CHARACTERSET, TAG_IPTC_CONFIRMEDDATASIZE,
-     TAG_IPTC_CONTENTLOCCODE, TAG_IPTC_CONTENTLOCNAME,
-     TAG_IPTC_DATECREATED, TAG_IPTC_DATESENT,
-     TAG_IPTC_DESTINATION, TAG_IPTC_EDITORIALUPDATE, TAG_IPTC_EDITSTATUS,
-     TAG_IPTC_ENVELOPENUM, TAG_IPTC_ENVELOPEPRIORITY, TAG_IPTC_EXPIRATIONDATE,
-     TAG_IPTC_EXPIRATIONTIME, TAG_IPTC_FILEFORMAT, TAG_IPTC_FILEVERSION,
-     TAG_IPTC_FIXTUREID, TAG_IPTC_IMAGETYPE, TAG_IPTC_LANGUAGEID,
-     TAG_IPTC_MAXOBJECTSIZE, TAG_IPTC_MAXSUBFILESIZE, TAG_IPTC_MODELVERSION,
-     TAG_IPTC_OBJECTATTRIBUTE, TAG_IPTC_OBJECTCYCLE, TAG_IPTC_OBJECTNAME,
-     TAG_IPTC_OBJECTSIZEANNOUNCED, TAG_IPTC_OBJECTTYPE, TAG_IPTC_ORIGINATINGPROGRAM,
-     TAG_IPTC_ORIGTRANSREF, TAG_IPTC_PREVIEWDATA, TAG_IPTC_PREVIEWFORMAT,
-     TAG_IPTC_PREVIEWFORMATVER, TAG_IPTC_PRODUCTID, TAG_IPTC_PROGRAMVERSION,
-     TAG_IPTC_PROVINCE, TAG_IPTC_RASTERIZEDCAPTION, TAG_IPTC_RECORDVERSION,
-     TAG_IPTC_REFERENCEDATE, TAG_IPTC_REFERENCENUMBER, TAG_IPTC_REFERENCESERVICE,
-     TAG_IPTC_RELEASEDATE, TAG_IPTC_RELEASETIME, TAG_IPTC_SERVICEID,
-     TAG_IPTC_SIZEMODE, TAG_IPTC_SOURCE, TAG_IPTC_SUBFILE, TAG_IPTC_SUBJECTREFERENCE,
-     TAG_IPTC_SUPPLCATEGORY, TAG_IPTC_TIMECREATED, TAG_IPTC_TIMESENT, TAG_IPTC_UNO,
-     TAG_IPTC_URGENCY, TAG_IPTC_WRITEREDITOR,
-
-     TAG_PDF_PAGESIZE, TAG_PDF_PAGEWIDTH, TAG_PDF_PAGEHEIGHT,
-     TAG_PDF_VERSION, TAG_PDF_PRODUCER,
-     TAG_PDF_EMBEDDEDFILES,
-     TAG_PDF_OPTIMIZED,
-     TAG_PDF_PRINTING,
-     TAG_PDF_HIRESPRINTING,
-     TAG_PDF_COPYING,
-     TAG_PDF_MODIFYING,
-     TAG_PDF_DOCASSEMBLY,
-     TAG_PDF_COMMENTING,
-     TAG_PDF_FORMFILLING,
-     TAG_PDF_ACCESSIBILITYSUPPORT
-    };
-
-
 inline GnomeCmdAdvrenameDialog::Private::Private()
 {
-    memset(menu_button, 0, sizeof(menu_button));
-    convert_case = gcmd_convert_unchanged;
-    trim_blanks = gcmd_convert_strip;
+    profile_menu_button = NULL;
     template_has_counters = FALSE;
-    regexes = NULL;
 }
 
 
 inline GnomeCmdAdvrenameDialog::Private::~Private()
 {
-    if (regexes)  g_object_unref (regexes);
 }
 
 
@@ -391,28 +107,6 @@ inline gboolean model_is_empty(GtkTreeModel *tree_model)
     return !gtk_tree_model_get_iter_first (tree_model, &iter);
 }
 
-void GnomeCmdAdvrenameDialog::Private::fill_regex_model(const GnomeCmdData::AdvrenameConfig::Profile &profile)
-{
-    if (!regexes)
-        return;
-
-    GtkTreeIter iter;
-
-    for (vector<GnomeCmd::ReplacePattern>::const_iterator r=profile.regexes.begin(); r!=profile.regexes.end(); ++r)
-    {
-        GnomeCmd::RegexReplace *rx = new GnomeCmd::RegexReplace(r->pattern, r->replacement, r->match_case);
-
-        gtk_list_store_append (GTK_LIST_STORE (regexes), &iter);
-        gtk_list_store_set (GTK_LIST_STORE (regexes), &iter,
-                            GnomeCmdAdvrenameDialog::COL_REGEX, rx,
-                            GnomeCmdAdvrenameDialog::COL_MALFORMED_REGEX, !*rx,
-                            GnomeCmdAdvrenameDialog::COL_PATTERN, rx->pattern.c_str(),
-                            GnomeCmdAdvrenameDialog::COL_REPLACE, rx->replacement.c_str(),
-                            GnomeCmdAdvrenameDialog::COL_MATCH_CASE, rx->match_case ? _("Yes") : _("No"),
-                            -1);
-    }
-}
-
 
 gchar *GnomeCmdAdvrenameDialog::Private::translate_menu (const gchar *path, gpointer data)
 {
@@ -420,227 +114,89 @@ gchar *GnomeCmdAdvrenameDialog::Private::translate_menu (const gchar *path, gpoi
 }
 
 
-inline GtkWidget *GnomeCmdAdvrenameDialog::Private::create_placeholder_menu(int menu_type, GnomeCmdData::AdvrenameConfig *cfg)
+inline GtkWidget *GnomeCmdAdvrenameDialog::Private::create_placeholder_menu(GnomeCmdData::AdvrenameConfig *cfg)
 {
-    static guint items_size[] = {G_N_ELEMENTS(dir_items),
-                                 G_N_ELEMENTS(name_items),
-                                 G_N_ELEMENTS(counter_items),
-                                 G_N_ELEMENTS(date_items)};
-    switch (menu_type)
-    {
-        case DIR_MENU:
-        case FILE_MENU:
-        case COUNTER_MENU:
-        case DATE_MENU:
-            {
-                GtkItemFactory *ifac = gtk_item_factory_new (GTK_TYPE_MENU, "<main>", NULL);
-
-                gtk_item_factory_set_translate_func (ifac, translate_menu, NULL, NULL);
-                gtk_item_factory_create_items (ifac, items_size[menu_type], items[menu_type], this);
-
-                return gtk_item_factory_get_widget (ifac, "<main>");
-            }
-
-        case METATAG_MENU:
-            {
-                GtkItemFactoryEntry *items = g_try_new0 (GtkItemFactoryEntry, G_N_ELEMENTS(metatags));
-
-                g_return_val_if_fail (items!=NULL, NULL);
-
-                for (guint i=0; i<G_N_ELEMENTS(metatags); ++i)
-                {
-                    GnomeCmdTag tag = metatags[i];
-                    const gchar *class_name = gcmd_tags_get_class_name(tag);
-                    GtkItemFactoryEntry *p = items+i;
-
-                    if (!class_name || *class_name==0)
-                    {
-                        p->path = g_strdup("/");
-                        p->item_type = "<Separator>";
-                    }
-                    else
-                    {
-                        p->path = g_strdup_printf ("/%s/%s", gcmd_tags_get_class_name(tag), gcmd_tags_get_title(tag));
-                        p->callback = (GtkItemFactoryCallback) insert_num_tag;
-                        p->callback_action = tag;
-                    }
-                }
-
-                GtkItemFactory *ifac = gtk_item_factory_new (GTK_TYPE_MENU, "<main>", NULL);
+    guint items_size = cfg->profiles.empty() ? 1 : cfg->profiles.size()+3;
+    GtkItemFactoryEntry *items = g_try_new0 (GtkItemFactoryEntry, items_size);
+    GtkItemFactoryEntry *i = items;
 
-                gtk_item_factory_create_items (ifac, G_N_ELEMENTS(metatags), items, this);
+    g_return_val_if_fail (items!=NULL, NULL);
 
-                for (guint i=0; i<G_N_ELEMENTS(metatags); ++i)
-                    g_free (items[i].path);
+    i->path = g_strdup (_("/_Save Profile As..."));
+    i->callback = (GtkItemFactoryCallback) manage_profiles;
+    i->callback_action = TRUE;
+    i->item_type = "<StockItem>";
+    i->extra_data = GTK_STOCK_SAVE_AS;
+    ++i;
 
-                g_free (items);
-
-                return gtk_item_factory_get_widget (ifac, "<main>");
-            }
-
-        case PROFILE_MENU:
-            {
-                guint items_size = cfg->profiles.empty() ? 1 : cfg->profiles.size()+3;
-                GtkItemFactoryEntry *items = g_try_new0 (GtkItemFactoryEntry, items_size);
-                GtkItemFactoryEntry *i = items;
-
-                g_return_val_if_fail (items!=NULL, NULL);
-
-                i->path = g_strdup (_("/_Save Profile As..."));
-                i->callback = (GtkItemFactoryCallback) manage_profiles;
-                i->callback_action = TRUE;
-                i->item_type = "<StockItem>";
-                i->extra_data = GTK_STOCK_SAVE_AS;
-                ++i;
-
-                if (!cfg->profiles.empty())
-                {
-                    i->path = g_strdup (_("/_Manage Profiles..."));
-                    i->callback = (GtkItemFactoryCallback) manage_profiles;
-                    i->item_type = "<StockItem>";
-                    i->extra_data = GTK_STOCK_EDIT;
-                    ++i;
-
-                    i->path = g_strdup ("/");
-                    i->item_type = "<Separator>";
-                    ++i;
-
-                    for (vector<GnomeCmdData::AdvrenameConfig::Profile>::const_iterator p=cfg->profiles.begin(); p!=cfg->profiles.end(); ++p, ++i)
-                    {
-                        i->path = g_strconcat ("/", p->name.c_str(), NULL);
-                        i->callback = (GtkItemFactoryCallback) load_profile;
-                        i->callback_action = (i-items)-3;
-                        i->item_type = "<StockItem>";
-                        i->extra_data = GTK_STOCK_REVERT_TO_SAVED;
-                    }
-                }
-
-                GtkItemFactory *ifac = gtk_item_factory_new (GTK_TYPE_MENU, "<main>", NULL);
-
-                gtk_item_factory_create_items (ifac, items_size, items, this);
-
-                for (guint i=0; i<items_size; ++i)
-                    g_free (items[i].path);
-
-                g_free (items);
+    if (!cfg->profiles.empty())
+    {
+        i->path = g_strdup (_("/_Manage Profiles..."));
+        i->callback = (GtkItemFactoryCallback) manage_profiles;
+        i->item_type = "<StockItem>";
+        i->extra_data = GTK_STOCK_EDIT;
+        ++i;
 
-                return gtk_item_factory_get_widget (ifac, "<main>");
-            }
+        i->path = g_strdup ("/");
+        i->item_type = "<Separator>";
+        ++i;
 
-        default:
-            return NULL;
+        for (vector<GnomeCmdData::AdvrenameConfig::Profile>::const_iterator p=cfg->profiles.begin(); p!=cfg->profiles.end(); ++p, ++i)
+        {
+            i->path = g_strconcat ("/", p->name.c_str(), NULL);
+            i->callback = (GtkItemFactoryCallback) load_profile;
+            i->callback_action = (i-items)-3;
+            i->item_type = "<StockItem>";
+            i->extra_data = GTK_STOCK_REVERT_TO_SAVED;
+        }
     }
-}
 
+    GtkItemFactory *ifac = gtk_item_factory_new (GTK_TYPE_MENU, "<main>", NULL);
 
-inline GtkWidget *GnomeCmdAdvrenameDialog::Private::create_button_with_menu(gchar *label_text, int menu_type, GnomeCmdData::AdvrenameConfig *cfg)
-{
-    menu_button[menu_type] = gnome_cmd_button_menu_new (label_text, create_placeholder_menu(menu_type, cfg));
+    gtk_item_factory_create_items (ifac, items_size, items, this);
 
-    return menu_button[menu_type];
-}
+    for (guint i=0; i<items_size; ++i)
+        g_free (items[i].path);
 
+    g_free (items);
 
-inline void GnomeCmdAdvrenameDialog::Private::insert_tag(const gchar *text)
-{
-    GtkEditable *editable = (GtkEditable *) template_entry;
-    gint pos = gtk_editable_get_position (editable);
-
-    gtk_editable_insert_text (editable, text, strlen(text), &pos);
-    gtk_editable_set_position (editable, pos);
-    gtk_widget_grab_focus ((GtkWidget *) editable);
-    gtk_editable_select_region (editable, pos, pos);
+    return gtk_item_factory_get_widget (ifac, "<main>");
 }
 
 
-void GnomeCmdAdvrenameDialog::Private::insert_text_tag(GnomeCmdAdvrenameDialog::Private *priv, guint n, GtkWidget *widget)
+inline GtkWidget *GnomeCmdAdvrenameDialog::Private::create_button_with_menu(gchar *label_text, GnomeCmdData::AdvrenameConfig *cfg)
 {
-    static const gchar *placeholder[] = {"$g",          //  0
-                                         "$p",          //  1
-                                         "$N",          //  2
-                                         "$n",          //  3
-                                         "$e",          //  4
-                                         "$c",          //  5
-                                         "$c(2)",       //  6
-                                         "$x(8)",       //  7
-                                         "%x",          //  8
-                                         "%Y-%m-%d",    //  9
-                                         "%y-%m-%d",    // 10
-                                         "%y.%m.%d",    // 11
-                                         "%y%m%d",      // 12
-                                         "%d.%m.%y",    // 13
-                                         "%m-%d-%y",    // 14
-                                         "%Y",          // 15
-                                         "%y",          // 16
-                                         "%m",          // 17
-                                         "%b",          // 18
-                                         "%d",          // 19
-                                         "%X",          // 20
-                                         "%H.%M.%S",    // 21
-                                         "%H-%M-%S",    // 22
-                                         "%H%M%S",      // 23
-                                         "%H",          // 24
-                                         "%M",          // 25
-                                         "%S"};         // 26
-
-    g_return_if_fail (n < G_N_ELEMENTS(placeholder));
-
-    priv->insert_tag(placeholder[n]);
-}
+    profile_menu_button = gnome_cmd_button_menu_new (label_text, create_placeholder_menu(cfg));
 
-
-void GnomeCmdAdvrenameDialog::Private::insert_num_tag(GnomeCmdAdvrenameDialog::Private *priv, guint tag, GtkWidget *widget)
-{
-    gchar *s = g_strdup_printf ("$T(%s)", gcmd_tags_get_name((GnomeCmdTag) tag));
-    priv->insert_tag(s);
-    g_free (s);
+    return profile_menu_button;
 }
 
 
 void GnomeCmdAdvrenameDialog::Private::manage_profiles(GnomeCmdAdvrenameDialog::Private *priv, guint new_profile, GtkWidget *widget)
 {
-    GtkWidget *dialog = gtk_widget_get_ancestor (priv->menu_button[PROFILE_MENU], GNOME_CMD_TYPE_ADVRENAME_DIALOG);
+    GtkWidget *dialog = gtk_widget_get_ancestor (priv->profile_menu_button, GNOME_CMD_TYPE_ADVRENAME_DIALOG);
 
     g_return_if_fail (dialog!=NULL);
 
     GnomeCmdData::AdvrenameConfig &cfg = GNOME_CMD_ADVRENAME_DIALOG(dialog)->defaults;
-    GtkTreeModel *regexes = GNOME_CMD_ADVRENAME_DIALOG(dialog)->priv->regexes;
 
     if (new_profile)
-    {
-        GtkTreeIter i;
-
-        cfg.default_profile.template_string = gtk_entry_get_text (GTK_ENTRY (priv->template_entry));
-        if (cfg.default_profile.template_string.empty())  cfg.default_profile.template_string = "$N";
-
-        cfg.default_profile.regexes.clear();
-
-        for (gboolean valid_iter=gtk_tree_model_get_iter_first (regexes, &i); valid_iter; valid_iter=gtk_tree_model_iter_next (regexes, &i))
-        {
-            GnomeCmd::RegexReplace *r;
-
-            gtk_tree_model_get (regexes, &i,
-                                COL_REGEX, &r,
-                                -1);
-            if (r)                            //  ignore null regex patterns
-                cfg.default_profile.regexes.push_back(*r);
-        }
-    }
+        priv->profile_component->copy();
 
     if (gnome_cmd_advrename_profiles_dialog_new (_("Profiles"), GTK_WINDOW (dialog), cfg,  new_profile))
     {
         GtkWidget *menu = widget->parent;
 
-        gnome_cmd_button_menu_disconnect_handler (priv->menu_button[PROFILE_MENU], menu);
+        gnome_cmd_button_menu_disconnect_handler (priv->profile_menu_button, menu);
         g_object_unref (gtk_item_factory_from_widget (menu));
-        gnome_cmd_button_menu_connect_handler (priv->menu_button[PROFILE_MENU], priv->create_placeholder_menu(PROFILE_MENU, &cfg));
+        gnome_cmd_button_menu_connect_handler (priv->profile_menu_button, priv->create_placeholder_menu(&cfg));
     }
 }
 
 
 void GnomeCmdAdvrenameDialog::Private::load_profile(GnomeCmdAdvrenameDialog::Private *priv, guint profile_idx, GtkWidget *widget)
 {
-    GtkWidget *dialog = gtk_widget_get_ancestor (priv->menu_button[PROFILE_MENU], GNOME_CMD_TYPE_ADVRENAME_DIALOG);
+    GtkWidget *dialog = gtk_widget_get_ancestor (priv->profile_menu_button, GNOME_CMD_TYPE_ADVRENAME_DIALOG);
 
     g_return_if_fail (dialog!=NULL);
 
@@ -648,31 +204,13 @@ void GnomeCmdAdvrenameDialog::Private::load_profile(GnomeCmdAdvrenameDialog::Pri
 
     g_return_if_fail (profile_idx<cfg.profiles.size());
 
-    GnomeCmdData::AdvrenameConfig::Profile &p = cfg.profiles[profile_idx];
-
-    gtk_entry_set_text (GTK_ENTRY (priv->template_entry), p.template_string.empty() ? "$N" : p.template_string.c_str());
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->counter_start_spin), p.counter_start);
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->counter_step_spin), p.counter_step);
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->counter_digits_spin), p.counter_width);
-
-    on_regex_remove_all_btn_clicked (NULL, GNOME_CMD_ADVRENAME_DIALOG(dialog));
-    priv->fill_regex_model(p);
+    cfg.default_profile = cfg.profiles[profile_idx];
+    priv->profile_component->update();
 
-    gtk_combo_box_set_active (GTK_COMBO_BOX (priv->case_combo), p.case_conversion);
-    gtk_combo_box_set_active (GTK_COMBO_BOX (priv->trim_combo), p.trim_blanks);
-
-    GNOME_CMD_ADVRENAME_DIALOG(dialog)->update_new_filenames();
-
-    cfg.default_profile = p;
-
-    gtk_widget_set_sensitive (priv->regex_edit_button, !model_is_empty(priv->regexes));
-    gtk_widget_set_sensitive (priv->regex_remove_button, !model_is_empty(priv->regexes));
-    gtk_widget_set_sensitive (priv->regex_remove_all_button, !model_is_empty(priv->regexes));
+    GNOME_CMD_ADVRENAME_DIALOG(dialog)->update_new_filenames();     //  FIXME:  ??
 }
 
 
-inline GtkWidget *create_regex_view ();
-
 inline GtkTreeModel *create_files_model ();
 inline GtkWidget *create_files_view ();
 
@@ -680,189 +218,22 @@ inline GtkWidget *create_files_view ();
 G_DEFINE_TYPE (GnomeCmdAdvrenameDialog, gnome_cmd_advrename_dialog, GTK_TYPE_DIALOG)
 
 
-void GnomeCmdAdvrenameDialog::Private::on_template_entry_changed(GtkEntry *entry, GnomeCmdAdvrenameDialog *dialog)
+void GnomeCmdAdvrenameDialog::Private::on_profile_template_changed (GnomeCmdProfileComponent *component, GnomeCmdAdvrenameDialog *dialog)
 {
-    gnome_cmd_advrename_parse_template (gtk_entry_get_text (GTK_ENTRY (dialog->priv->template_entry)), dialog->priv->template_has_counters);
+    gnome_cmd_advrename_parse_template (component->get_template_entry(), dialog->priv->template_has_counters);
     dialog->update_new_filenames();
 }
 
 
-void GnomeCmdAdvrenameDialog::Private::on_counter_start_spin_value_changed (GtkWidget *spin, GnomeCmdAdvrenameDialog *dialog)
+void GnomeCmdAdvrenameDialog::Private::on_profile_counter_changed (GnomeCmdProfileComponent *component, GnomeCmdAdvrenameDialog *dialog)
 {
-    dialog->defaults.default_profile.counter_start = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
     if (dialog->priv->template_has_counters)
         dialog->update_new_filenames();
 }
 
 
-void GnomeCmdAdvrenameDialog::Private::on_counter_step_spin_value_changed (GtkWidget *spin, GnomeCmdAdvrenameDialog *dialog)
-{
-    dialog->defaults.default_profile.counter_step = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-    if (dialog->priv->template_has_counters)
-        dialog->update_new_filenames();
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_counter_digits_spin_value_changed (GtkWidget *spin, GnomeCmdAdvrenameDialog *dialog)
-{
-    dialog->defaults.default_profile.counter_width = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
-    if (dialog->priv->template_has_counters)
-        dialog->update_new_filenames();
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_regex_model_row_deleted (GtkTreeModel *treemodel, GtkTreePath *path, GnomeCmdAdvrenameDialog *dialog)
-{
-    dialog->update_new_filenames();
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_regex_add_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog)
-{
-    GnomeCmd::RegexReplace *rx = new GnomeCmd::RegexReplace;
-
-    if (gnome_cmd_advrename_regex_dialog_new (_("Add Rule"), GTK_WINDOW (dialog), rx))
-    {
-        GtkTreeIter i;
-
-        gtk_list_store_append (GTK_LIST_STORE (dialog->priv->regexes), &i);
-        gtk_list_store_set (GTK_LIST_STORE (dialog->priv->regexes), &i,
-                            COL_REGEX, rx,
-                            COL_MALFORMED_REGEX, !*rx,
-                            COL_PATTERN, rx->pattern.c_str(),
-                            COL_REPLACE, rx->replacement.c_str(),
-                            COL_MATCH_CASE, rx->match_case ? _("Yes") : _("No"),
-                            -1);
-
-        dialog->update_new_filenames();
-
-        gtk_widget_set_sensitive (dialog->priv->regex_edit_button, TRUE);
-        gtk_widget_set_sensitive (dialog->priv->regex_remove_button, TRUE);
-        gtk_widget_set_sensitive (dialog->priv->regex_remove_all_button, TRUE);
-    }
-    else
-        delete rx;
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_regex_edit_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog)
-{
-    GtkTreeView *tree_view = GTK_TREE_VIEW (dialog->priv->regex_view);
-    GtkTreeIter i;
-
-    if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree_view), NULL, &i))
-    {
-        GnomeCmd::RegexReplace *rx = NULL;
-
-        gtk_tree_model_get (dialog->priv->regexes, &i, COL_REGEX, &rx, -1);
-
-        if (gnome_cmd_advrename_regex_dialog_new (_("Edit Rule"), GTK_WINDOW (dialog), rx))
-        {
-            gtk_list_store_set (GTK_LIST_STORE (dialog->priv->regexes), &i,
-                                COL_REGEX, rx,
-                                COL_MALFORMED_REGEX, !*rx,
-                                COL_PATTERN, rx->pattern.c_str(),
-                                COL_REPLACE, rx->replacement.c_str(),
-                                COL_MATCH_CASE, rx->match_case ? _("Yes") : _("No"),
-                                -1);
-
-            dialog->update_new_filenames();
-        }
-    }
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_regex_remove_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog)
-{
-    GtkTreeView *tree_view = GTK_TREE_VIEW (dialog->priv->regex_view);
-    GtkTreeIter i;
-
-    if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree_view), NULL, &i))
-    {
-        GnomeCmd::RegexReplace *rx = NULL;
-
-        gtk_tree_model_get (dialog->priv->regexes, &i, COL_REGEX, &rx, -1);
-        gtk_list_store_remove (GTK_LIST_STORE (dialog->priv->regexes), &i);
-        delete rx;
-
-        if (model_is_empty (dialog->priv->regexes))
-        {
-            gtk_widget_set_sensitive (dialog->priv->regex_edit_button, FALSE);
-            gtk_widget_set_sensitive (dialog->priv->regex_remove_button, FALSE);
-            gtk_widget_set_sensitive (dialog->priv->regex_remove_all_button, FALSE);
-        }
-    }
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_regex_remove_all_btn_clicked (GtkButton *button, GnomeCmdAdvrenameDialog *dialog)
-{
-    GtkTreeIter i;
-
-    for (gboolean valid_iter=gtk_tree_model_get_iter_first (dialog->priv->regexes, &i); valid_iter; valid_iter=gtk_tree_model_iter_next (dialog->priv->regexes, &i))
-    {
-        GnomeCmd::RegexReplace *rx = NULL;
-
-        gtk_tree_model_get (dialog->priv->regexes, &i, COL_REGEX, &rx, -1);
-        delete rx;
-    }
-
-    g_signal_handlers_block_by_func (dialog->priv->regexes, gpointer (on_regex_model_row_deleted), dialog);
-    gtk_list_store_clear (GTK_LIST_STORE (dialog->priv->regexes));
-    g_signal_handlers_unblock_by_func (dialog->priv->regexes, gpointer (on_regex_model_row_deleted), dialog);
-
-    dialog->update_new_filenames();
-
-    gtk_widget_set_sensitive (dialog->priv->regex_edit_button, FALSE);
-    gtk_widget_set_sensitive (dialog->priv->regex_remove_button, FALSE);
-    gtk_widget_set_sensitive (dialog->priv->regex_remove_all_button, FALSE);
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_regex_view_row_activated (GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, GnomeCmdAdvrenameDialog *dialog)
-{
-    on_regex_edit_btn_clicked (NULL, dialog);
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_case_combo_changed (GtkComboBox *combo, GnomeCmdAdvrenameDialog *dialog)
-{
-    gint item = gtk_combo_box_get_active (combo);
-
-    switch (item)
-    {
-        case 0: dialog->priv->convert_case = gcmd_convert_unchanged; break;
-        case 1: dialog->priv->convert_case = gcmd_convert_lowercase; break;
-        case 2: dialog->priv->convert_case = gcmd_convert_uppercase; break;
-        case 3: dialog->priv->convert_case = gcmd_convert_sentence_case; break;
-        case 4: dialog->priv->convert_case = gcmd_convert_initial_caps; break;
-        case 5: dialog->priv->convert_case = gcmd_convert_toggle_case; break;
-
-        default:
-            return;
-    }
-
-    dialog->defaults.default_profile.case_conversion = item;
-    dialog->update_new_filenames();
-}
-
-
-void GnomeCmdAdvrenameDialog::Private::on_trim_combo_changed (GtkComboBox *combo, GnomeCmdAdvrenameDialog *dialog)
+void GnomeCmdAdvrenameDialog::Private::on_profile_regex_changed (GnomeCmdProfileComponent *component, GnomeCmdAdvrenameDialog *dialog)
 {
-    gint item = gtk_combo_box_get_active (combo);
-
-    switch (item)
-    {
-        case 0: dialog->priv->trim_blanks = gcmd_convert_unchanged; break;
-        case 1: dialog->priv->trim_blanks = gcmd_convert_ltrim; break;
-        case 2: dialog->priv->trim_blanks = gcmd_convert_rtrim; break;
-        case 3: dialog->priv->trim_blanks = gcmd_convert_strip; break;
-
-        default:
-            return;
-    }
-
-    dialog->defaults.default_profile.trim_blanks = item;
     dialog->update_new_filenames();
 }
 
@@ -946,7 +317,7 @@ void GnomeCmdAdvrenameDialog::Private::on_files_view_popup_menu__update_files (G
                             -1);
     }
 
-    gnome_cmd_advrename_parse_template (gtk_entry_get_text (GTK_ENTRY (dialog->priv->template_entry)), dialog->priv->template_has_counters);
+    gnome_cmd_advrename_parse_template (dialog->priv->profile_component->get_template_entry(), dialog->priv->template_has_counters);
     dialog->update_new_filenames();
 }
 
@@ -1072,14 +443,14 @@ void GnomeCmdAdvrenameDialog::Private::on_dialog_response (GnomeCmdAdvrenameDial
                 g_free (new_name);
             }
             dialog->update_new_filenames();
-            dialog->defaults.templates.add(gtk_entry_get_text (GTK_ENTRY (dialog->priv->template_entry)));
+            dialog->defaults.templates.add(dialog->priv->profile_component->get_template_entry());
             break;
 
         case GTK_RESPONSE_NONE:
         case GTK_RESPONSE_DELETE_EVENT:
         case GTK_RESPONSE_CANCEL:
         case GTK_RESPONSE_CLOSE:
-            dialog->defaults.templates.add(gtk_entry_get_text (GTK_ENTRY (dialog->priv->template_entry)));
+            dialog->defaults.templates.add(dialog->priv->profile_component->get_template_entry());
             gtk_widget_hide (*dialog);
             dialog->unset();
             g_signal_stop_emission_by_name (dialog, "response");        //  FIXME:  ???
@@ -1094,13 +465,10 @@ void GnomeCmdAdvrenameDialog::Private::on_dialog_response (GnomeCmdAdvrenameDial
             break;
 
         case GCMD_RESPONSE_RESET:
-            gtk_entry_set_text (GTK_ENTRY (dialog->priv->template_entry), "$N");
-            gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->counter_start_spin), 1);
-            gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->counter_step_spin), 1);
-            gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->priv->counter_digits_spin), 1);
-            gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->priv->case_combo), 0);
-            gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->priv->trim_combo), 3);
-            on_regex_remove_all_btn_clicked (NULL, dialog);
+            dialog->defaults.default_profile.reset();
+            dialog->defaults.default_profile.template_string = "$N";
+            dialog->priv->profile_component->update();
+
             break;
 
         default :
@@ -1119,243 +487,33 @@ static void gnome_cmd_advrename_dialog_init (GnomeCmdAdvrenameDialog *dialog)
     gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
     gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2);
 
-    GtkWidget *align;
-    GtkWidget *label;
-    GtkWidget *table;
-    GtkWidget *combo;
-    GtkWidget *hbox;
-    GtkWidget *vbox;
-    GtkWidget *bbox;
-    GtkWidget *spin;
-    GtkWidget *button;
-
-    gchar *str;
-
-    vbox = gtk_vbox_new (FALSE, 6);
+    GtkWidget *vbox = dialog->priv->vbox = gtk_vbox_new (FALSE, 6);
     gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, TRUE, TRUE, 0);
 
-    hbox = gtk_hbox_new (FALSE, 18);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-
-    // Template
-    {
-        GtkWidget *vbox = gtk_vbox_new (FALSE, 6);
-        gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
-
-        str = g_strdup_printf ("<b>%s</b>", _("_Template"));
-        label = gtk_label_new_with_mnemonic (str);
-        g_free (str);
-
-        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
-
-        align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
-        gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, 12, 0);
-        gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
-
-        {
-            GtkWidget *vbox = gtk_vbox_new (FALSE, 6);
-            gtk_container_add (GTK_CONTAINER (align), vbox);
-
-            dialog->priv->template_combo = combo = gtk_combo_box_entry_new_text ();
-            dialog->priv->template_entry = gtk_bin_get_child (GTK_BIN (dialog->priv->template_combo));
-            gtk_entry_set_activates_default (GTK_ENTRY (dialog->priv->template_entry), TRUE);
-            gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
-            gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0);
-
-            GtkWidget *bbox = gtk_hbutton_box_new ();
-            gtk_box_pack_start (GTK_BOX (vbox), bbox, TRUE, FALSE, 0);
-
-            gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START);
-            gtk_box_set_spacing (GTK_BOX (bbox), 6);
-            gtk_box_pack_start (GTK_BOX (bbox), dialog->priv->create_button_with_menu (_("Directory"), GnomeCmdAdvrenameDialog::Private::DIR_MENU), FALSE, FALSE, 0);
-            gtk_box_pack_start (GTK_BOX (bbox), dialog->priv->create_button_with_menu (_("File"), GnomeCmdAdvrenameDialog::Private::FILE_MENU), FALSE, FALSE, 0);
-            gtk_box_pack_start (GTK_BOX (bbox), dialog->priv->create_button_with_menu (_("Counter"), GnomeCmdAdvrenameDialog::Private::COUNTER_MENU), FALSE, FALSE, 0);
-            gtk_box_pack_start (GTK_BOX (bbox), dialog->priv->create_button_with_menu (_("Date"), GnomeCmdAdvrenameDialog::Private::DATE_MENU), FALSE, FALSE, 0);
-            gtk_box_pack_start (GTK_BOX (bbox), dialog->priv->create_button_with_menu (_("Metatag"), GnomeCmdAdvrenameDialog::Private::METATAG_MENU), FALSE, FALSE, 0);
-        }
-    }
-
-
-    // Counter
-    {
-        GtkWidget *vbox = gtk_vbox_new (FALSE, 6);
-        gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
-
-        str = g_strdup_printf ("<b>%s</b>", _("Counter"));
-        label = gtk_label_new_with_mnemonic (str);
-        g_free (str);
-
-        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
-
-        align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
-        gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, 12, 0);
-        gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
-
-        table = gtk_table_new (3, 2, FALSE);
-        gtk_table_set_row_spacings (GTK_TABLE (table), 6);
-        gtk_table_set_col_spacings (GTK_TABLE (table), 12);
-        gtk_container_add (GTK_CONTAINER (align), table);
-
-        label = gtk_label_new_with_mnemonic (_("_Start:"));
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        dialog->priv->counter_start_spin = spin = gtk_spin_button_new_with_range (0, 1000000, 1);
-        gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin);
-        gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
-        gtk_table_attach_defaults (GTK_TABLE (table), spin, 1, 2, 0, 1);
-
-        label = gtk_label_new_with_mnemonic (_("Ste_p:"));
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        dialog->priv->counter_step_spin = spin = gtk_spin_button_new_with_range (-1000, 1000, 1);
-        gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin);
-        gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
-        gtk_table_attach_defaults (GTK_TABLE (table), spin, 1, 2, 1, 2);
-
-        label = gtk_label_new_with_mnemonic (_("Di_gits:"));
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        dialog->priv->counter_digits_spin = spin = gtk_spin_button_new_with_range (1, 16, 1);
-        gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin);
-        gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
-        gtk_table_attach_defaults (GTK_TABLE (table), spin, 1, 2, 2, 3);
-    }
-
-
-    // Regex
-    {
-        str = g_strdup_printf ("<b>%s</b>", _("Regex replacing"));
-        label = gtk_label_new (str);
-        g_free (str);
-
-        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
-
-        align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
-        gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 18, 12, 0);
-        gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
-
-        table = gtk_table_new (2, 1, FALSE);
-        gtk_table_set_row_spacings (GTK_TABLE (table), 6);
-        gtk_table_set_col_spacings (GTK_TABLE (table), 12);
-        gtk_container_add (GTK_CONTAINER (align), table);
-
-        GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
-        gtk_table_attach (GTK_TABLE (table), scrolled_window, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), GTK_FILL, 0, 0);
-
-        dialog->priv->regex_view = create_regex_view ();
-        gtk_container_add (GTK_CONTAINER (scrolled_window), dialog->priv->regex_view);
-
-        bbox = gtk_vbutton_box_new ();
-        gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
-        gtk_box_set_spacing (GTK_BOX (bbox), 12);
-        gtk_table_attach (GTK_TABLE (table), bbox, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
-
-        dialog->priv->regex_add_button = button = gtk_button_new_from_stock (GTK_STOCK_ADD);
-        gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-
-        dialog->priv->regex_edit_button = button = gtk_button_new_from_stock (GTK_STOCK_EDIT);
-        gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-
-        dialog->priv->regex_remove_button = button = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
-        gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-
-        dialog->priv->regex_remove_all_button = button = gtk_button_new_with_mnemonic (_("Remove A_ll"));
-        gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0);
-    }
-
-
-    align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
-    gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 18, 0, 0);
-    gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
-    hbox = gtk_hbox_new (FALSE, 12);
-    gtk_container_add (GTK_CONTAINER (align), hbox);
-
-    // Case conversion & blank triming
-    {
-        str = g_strdup_printf ("<b>%s</b>", _("Case"));
-        label = gtk_label_new_with_mnemonic (str);
-        g_free (str);
-
-        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
-        dialog->priv->case_combo = combo = gtk_combo_box_new_text ();
-        gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
-
-        gchar *case_modes[] = {
-                                _("<unchanged>"),
-                                _("lowercase"),
-                                _("UPPERCASE"),
-                                NULL,
-                                _("Sentence case"),       //  FIXME
-                                _("Initial Caps"),        //  FIXME
-                                _("tOGGLE cASE"),         //  FIXME
-                                NULL
-                              };
-
-        for (gchar **items=case_modes; *items; ++items)
-            gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _(*items));
-
-        gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
-
-
-        str = g_strdup_printf ("<b>%s</b>", _("Trim blanks"));
-        label = gtk_label_new_with_mnemonic (str);
-        g_free (str);
-
-        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
-        dialog->priv->trim_combo = combo = gtk_combo_box_new_text ();
-        gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
-
-        gchar *trim_modes[] = {
-                                  _("<none>"),
-                                  _("leading"),
-                                  _("trailing"),
-                                  _("leading and trailing"),
-                                  NULL
-                              };
-
-        for (gchar **items=trim_modes; *items; ++items)
-            gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _(*items));
-
-        gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
-    }
-
     // Results
-    {
-        str = g_strdup_printf ("<b>%s</b>", _("Results"));
-        label = gtk_label_new_with_mnemonic (str);
-        g_free (str);
+    gchar *str = g_strdup_printf ("<b>%s</b>", _("Results"));
+    GtkWidget *label = gtk_label_new_with_mnemonic (str);
+    g_free (str);
 
-        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+    gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+    gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
 
-        align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
-        gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 6, 12, 0);
-        gtk_container_add (GTK_CONTAINER (vbox), align);
+    GtkWidget *align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 6, 12, 0);
+    gtk_container_add (GTK_CONTAINER (vbox), align);
 
-        GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
-        gtk_container_add (GTK_CONTAINER (align), scrolled_window);
+    GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
+    gtk_container_add (GTK_CONTAINER (align), scrolled_window);
 
-        dialog->priv->files_view = create_files_view ();
-        gtk_container_add (GTK_CONTAINER (scrolled_window), dialog->priv->files_view);
+    dialog->priv->files_view = create_files_view ();
+    gtk_container_add (GTK_CONTAINER (scrolled_window), dialog->priv->files_view);
 
-        GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->files_view));
-        gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
-    }
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->files_view));
+    gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
 }
 
 
@@ -1363,21 +521,6 @@ static void gnome_cmd_advrename_dialog_finalize (GObject *object)
 {
     GnomeCmdAdvrenameDialog *dialog = GNOME_CMD_ADVRENAME_DIALOG (object);
 
-    GtkTreeIter i;
-
-    dialog->defaults.default_profile.regexes.clear();
-
-    for (gboolean valid_iter=gtk_tree_model_get_iter_first (dialog->priv->regexes, &i); valid_iter; valid_iter=gtk_tree_model_iter_next (dialog->priv->regexes, &i))
-    {
-        GnomeCmd::RegexReplace *rx;
-
-        gtk_tree_model_get (dialog->priv->regexes, &i,
-                            GnomeCmdAdvrenameDialog::COL_REGEX, &rx,
-                            -1);
-        if (rx)                            //  ignore null regex patterns
-           dialog-> defaults.default_profile.regexes.push_back(*rx);
-    }
-
     delete dialog->priv;
 
     G_OBJECT_CLASS (gnome_cmd_advrename_dialog_parent_class)->finalize (object);
@@ -1392,44 +535,6 @@ static void gnome_cmd_advrename_dialog_class_init (GnomeCmdAdvrenameDialogClass
 }
 
 
-inline GtkWidget *create_regex_view ()
-{
-    GtkWidget *view = gtk_tree_view_new ();
-
-    g_object_set (view,
-                  "rules-hint", TRUE,
-                  "reorderable", TRUE,
-                  "enable-search", FALSE,
-                  NULL);
-
-    GtkCellRenderer *renderer = NULL;
-    GtkTreeViewColumn *col = NULL;
-
-    GtkTooltips *tips = gtk_tooltips_new ();
-
-    col = gnome_cmd_treeview_create_new_text_column (GTK_TREE_VIEW (view), renderer, GnomeCmdAdvrenameDialog::COL_PATTERN, _("Search for"));
-    g_object_set (renderer, "foreground", "red", NULL);
-    gtk_tree_view_column_add_attribute (col, renderer, "foreground-set", GnomeCmdAdvrenameDialog::COL_MALFORMED_REGEX);
-    gtk_tooltips_set_tip (tips, col->button, _("Regex pattern"), NULL);
-
-    col = gnome_cmd_treeview_create_new_text_column (GTK_TREE_VIEW (view), renderer, GnomeCmdAdvrenameDialog::COL_REPLACE, _("Replace with"));
-    g_object_set (renderer, "foreground", "red", NULL);
-    gtk_tree_view_column_add_attribute (col, renderer, "foreground-set", GnomeCmdAdvrenameDialog::COL_MALFORMED_REGEX);
-    gtk_tooltips_set_tip (tips, col->button, _("Replacement"), NULL);
-
-    col = gnome_cmd_treeview_create_new_text_column (GTK_TREE_VIEW (view), renderer, GnomeCmdAdvrenameDialog::COL_MATCH_CASE, _("Match case"));
-    g_object_set (renderer, "foreground", "red", NULL);
-    gtk_tree_view_column_add_attribute (col, renderer, "foreground-set", GnomeCmdAdvrenameDialog::COL_MALFORMED_REGEX);
-    gtk_tooltips_set_tip (tips, col->button, _("Case sensitive matching"), NULL);
-
-    g_object_set (renderer,
-                  "xalign", 0.0,
-                  NULL);
-
-    return view;
-}
-
-
 inline GtkTreeModel *create_files_model ()
 {
     GtkListStore *store = gtk_list_store_new (GnomeCmdAdvrenameDialog::NUM_FILE_COLS,
@@ -1499,12 +604,14 @@ void GnomeCmdAdvrenameDialog::update_new_filenames()
 
     vector<GnomeCmd::RegexReplace *> rx;
 
-    for (gboolean valid_iter=gtk_tree_model_get_iter_first (priv->regexes, &i); valid_iter; valid_iter=gtk_tree_model_iter_next (priv->regexes, &i))
+    GtkTreeModel *regexes = priv->profile_component->get_regex_model();
+
+    for (gboolean valid_iter=gtk_tree_model_get_iter_first (regexes, &i); valid_iter; valid_iter=gtk_tree_model_iter_next (regexes, &i))
     {
         GnomeCmd::RegexReplace *r;
 
-        gtk_tree_model_get (priv->regexes, &i,
-                            COL_REGEX, &r,
+        gtk_tree_model_get (regexes, &i,
+                            GnomeCmdProfileComponent::COL_REGEX, &r,
                             -1);
         if (r && *r)                            //  ignore regex pattern if it can't be retrieved or if it is malformed
             rx.push_back(r);
@@ -1560,7 +667,7 @@ void GnomeCmdAdvrenameDialog::update_new_filenames()
             g_free (prev_fname);
         }
 
-        fname = priv->trim_blanks (priv->convert_case (fname));
+        fname = priv->profile_component->trim_blanks (priv->profile_component->convert_case (fname));
         gtk_list_store_set (GTK_LIST_STORE (files), &i,
                             COL_NEW_NAME, fname,
                             -1);
@@ -1571,10 +678,10 @@ void GnomeCmdAdvrenameDialog::update_new_filenames()
 
 GnomeCmdAdvrenameDialog::GnomeCmdAdvrenameDialog(GnomeCmdData::AdvrenameConfig &cfg): defaults(cfg)
 {
-    gtk_window_set_default_size (*this, defaults.width, defaults.height);
+    gtk_window_set_default_size (*this, cfg.width, cfg.height);
 
     gtk_dialog_add_action_widget (*this,
-                                  priv->create_button_with_menu (_("Profiles..."), Private::PROFILE_MENU, &cfg),
+                                  priv->create_button_with_menu (_("Profiles..."), &cfg),
                                   GCMD_RESPONSE_PROFILES);
 
     gtk_dialog_add_buttons (*this,
@@ -1586,51 +693,20 @@ GnomeCmdAdvrenameDialog::GnomeCmdAdvrenameDialog(GnomeCmdData::AdvrenameConfig &
 
     gtk_dialog_set_default_response (*this, GTK_RESPONSE_APPLY);
 
+    priv->profile_component = new GnomeCmdProfileComponent(cfg.default_profile);
+
+    gtk_box_pack_start (GTK_BOX (priv->vbox), *priv->profile_component, FALSE, FALSE, 0);
+    gtk_box_reorder_child (GTK_BOX (priv->vbox), *priv->profile_component, 0);
+
     // Template
-    for (GList *i=defaults.templates.ents; i; i=i->next)
-        gtk_combo_box_append_text (GTK_COMBO_BOX (priv->template_combo), (const gchar *) i->data);
-
-    gtk_entry_set_text (GTK_ENTRY (priv->template_entry), defaults.templates.empty() ? "$N" : defaults.templates.front());
-    gtk_editable_set_position (GTK_EDITABLE (priv->template_entry), -1);
-    gtk_widget_grab_focus (priv->template_entry);
-    gtk_entry_select_region (GTK_ENTRY (priv->template_entry), -1, -1);
-
-    g_signal_connect (priv->template_combo, "changed", G_CALLBACK (Private::on_template_entry_changed), this);
-
-    // Counter
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->counter_start_spin), defaults.default_profile.counter_start);
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->counter_step_spin), defaults.default_profile.counter_step);
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->counter_digits_spin), defaults.default_profile.counter_width);
-    g_signal_connect (priv->counter_start_spin, "value-changed", G_CALLBACK (Private::on_counter_start_spin_value_changed), this);
-    g_signal_connect (priv->counter_step_spin, "value-changed", G_CALLBACK (Private::on_counter_step_spin_value_changed), this);
-    g_signal_connect (priv->counter_digits_spin, "value-changed", G_CALLBACK (Private::on_counter_digits_spin_value_changed), this);
-
-    // Regex
-    priv->regexes = GTK_TREE_MODEL (gtk_list_store_new (NUM_REGEX_COLS,
-                                                        G_TYPE_POINTER,
-                                                        G_TYPE_BOOLEAN,
-                                                        G_TYPE_STRING,
-                                                        G_TYPE_STRING,
-                                                        G_TYPE_STRING));
-    priv->fill_regex_model(cfg.default_profile);
-    gtk_tree_view_set_model (GTK_TREE_VIEW (priv->regex_view), priv->regexes);
-
-    g_signal_connect (priv->regexes, "row-deleted", G_CALLBACK (Private::on_regex_model_row_deleted), this);
-    g_signal_connect (priv->regex_view, "row-activated", G_CALLBACK (Private::on_regex_view_row_activated), this);
-    g_signal_connect (priv->regex_add_button, "clicked", G_CALLBACK (Private::on_regex_add_btn_clicked), this);
-    g_signal_connect (priv->regex_edit_button, "clicked", G_CALLBACK (Private::on_regex_edit_btn_clicked), this);
-    g_signal_connect (priv->regex_remove_button, "clicked", G_CALLBACK (Private::on_regex_remove_btn_clicked), this);
-    g_signal_connect (priv->regex_remove_all_button, "clicked", G_CALLBACK (Private::on_regex_remove_all_btn_clicked), this);
-
-    // Case conversion & blank triming
-    gtk_combo_box_set_active (GTK_COMBO_BOX (priv->case_combo), defaults.default_profile.case_conversion);
-    gtk_combo_box_set_active (GTK_COMBO_BOX (priv->trim_combo), defaults.default_profile.trim_blanks);
-    g_signal_connect (priv->case_combo, "changed", G_CALLBACK (Private::on_case_combo_changed), this);
-    g_signal_connect (priv->trim_combo, "changed", G_CALLBACK (Private::on_trim_combo_changed), this);
+    priv->profile_component->set_template_history(defaults.templates.ents);
 
     // Results
     files = create_files_model ();
 
+    g_signal_connect (priv->profile_component, "template-changed", G_CALLBACK (Private::on_profile_template_changed), this);
+    g_signal_connect (priv->profile_component, "counter-changed", G_CALLBACK (Private::on_profile_counter_changed), this);
+    g_signal_connect (priv->profile_component, "regex-changed", G_CALLBACK (Private::on_profile_regex_changed), this);
     g_signal_connect (files, "row-deleted", G_CALLBACK (Private::on_files_model_row_deleted), this);
     g_signal_connect (priv->files_view, "button-press-event", G_CALLBACK (Private::on_files_view_button_pressed), this);
     g_signal_connect (priv->files_view, "popup-menu", G_CALLBACK (Private::on_files_view_popup_menu), this);
@@ -1640,7 +716,7 @@ GnomeCmdAdvrenameDialog::GnomeCmdAdvrenameDialog(GnomeCmdData::AdvrenameConfig &
     g_signal_connect (this, "size-allocate", G_CALLBACK (Private::on_dialog_size_allocate), this);
     g_signal_connect (this, "response", G_CALLBACK (Private::on_dialog_response), this);
 
-    gnome_cmd_advrename_parse_template (gtk_entry_get_text (GTK_ENTRY (priv->template_entry)), priv->template_has_counters);
+    gnome_cmd_advrename_parse_template (priv->profile_component->get_template_entry(), priv->template_has_counters);
 }
 
 
diff --git a/src/gnome-cmd-advrename-dialog.h b/src/gnome-cmd-advrename-dialog.h
index 02e8e72..3cb7626 100644
--- a/src/gnome-cmd-advrename-dialog.h
+++ b/src/gnome-cmd-advrename-dialog.h
@@ -50,7 +50,6 @@ struct GnomeCmdAdvrenameDialog
 
     enum {GCMD_RESPONSE_PROFILES=123, GCMD_RESPONSE_RESET};
 
-    enum {COL_REGEX, COL_MALFORMED_REGEX, COL_PATTERN, COL_REPLACE, COL_MATCH_CASE, NUM_REGEX_COLS};
     enum {COL_FILE, COL_NAME, COL_NEW_NAME, COL_SIZE, COL_DATE, COL_RENAME_FAILED, NUM_FILE_COLS};
 
     GnomeCmdData::AdvrenameConfig &defaults;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]