summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:29:28 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:29:28 +0200
commit75c07011b7c4d06acd7b45dabdcd60ab9d80f385 (patch)
tree8853c3978dd152ef377e652239448b1352320206
parent5.22 (diff)
downloadFreeFileSync-75c07011b7c4d06acd7b45dabdcd60ab9d80f385.tar.gz
FreeFileSync-75c07011b7c4d06acd7b45dabdcd60ab9d80f385.tar.bz2
FreeFileSync-75c07011b7c4d06acd7b45dabdcd60ab9d80f385.zip
5.23
-rw-r--r--BUILD/FreeFileSync.chmbin416035 -> 0 bytes
-rw-r--r--BUILD/Help/html/Command line.html129
-rw-r--r--BUILD/Help/html/Comparison Settings.html130
-rw-r--r--BUILD/Help/html/Daylight Saving Time.html74
-rw-r--r--BUILD/Help/html/Exclude Items.html147
-rw-r--r--BUILD/Help/html/Expert settings.html89
-rw-r--r--BUILD/Help/html/External Applications.html64
-rw-r--r--BUILD/Help/html/FreeFileSync.html82
-rw-r--r--BUILD/Help/html/Links.html35
-rw-r--r--BUILD/Help/html/Macros.html133
-rw-r--r--BUILD/Help/html/RealtimeSync.html147
-rw-r--r--BUILD/Help/html/Run as Service.html60
-rw-r--r--BUILD/Help/html/Schedule a Batch Job.html120
-rw-r--r--BUILD/Help/html/Synchronize with FTP.html77
-rw-r--r--BUILD/Help/html/Variable Drive Letters.html70
-rw-r--r--BUILD/Help/html/Versioning.html94
-rw-r--r--BUILD/Help/html/Volume Shadow Copy.html67
-rw-r--r--BUILD/HideConsole.vbs17
-rw-r--r--FreeFileSync/Build/Changelog.txt (renamed from BUILD/Changelog.txt)21
-rw-r--r--FreeFileSync/Build/Help/FreeFileSync.hhc (renamed from BUILD/Help/FreeFileSync.hhc)0
-rw-r--r--FreeFileSync/Build/Help/FreeFileSync.hhp (renamed from BUILD/Help/FreeFileSync.hhp)0
-rw-r--r--FreeFileSync/Build/Help/html/Command Line.html140
-rw-r--r--FreeFileSync/Build/Help/html/Comparison Settings.html104
-rw-r--r--FreeFileSync/Build/Help/html/Daylight Saving Time.html62
-rw-r--r--FreeFileSync/Build/Help/html/Exclude Items.html136
-rw-r--r--FreeFileSync/Build/Help/html/Expert Settings.html86
-rw-r--r--FreeFileSync/Build/Help/html/External Applications.html60
-rw-r--r--FreeFileSync/Build/Help/html/FreeFileSync.html58
-rw-r--r--FreeFileSync/Build/Help/html/Links.html29
-rw-r--r--FreeFileSync/Build/Help/html/Macros.html147
-rw-r--r--FreeFileSync/Build/Help/html/RealtimeSync.html125
-rw-r--r--FreeFileSync/Build/Help/html/Run as Service.html56
-rw-r--r--FreeFileSync/Build/Help/html/Schedule a Batch Job.html90
-rw-r--r--FreeFileSync/Build/Help/html/Synchronize with FTP.html56
-rw-r--r--FreeFileSync/Build/Help/html/Variable Drive Letters.html59
-rw-r--r--FreeFileSync/Build/Help/html/Versioning.html89
-rw-r--r--FreeFileSync/Build/Help/html/Volume Shadow Copy.html60
-rw-r--r--FreeFileSync/Build/Help/html/base.css49
-rw-r--r--FreeFileSync/Build/Help/img/CmpSettings.png (renamed from BUILD/Help/img/CmpSettings.png)bin16851 -> 16851 bytes
-rw-r--r--FreeFileSync/Build/Help/img/CompareButton.png (renamed from BUILD/Help/img/CompareButton.png)bin4438 -> 4438 bytes
-rw-r--r--FreeFileSync/Build/Help/img/FFS_logo.png (renamed from BUILD/Help/img/FFS_logo.png)bin8711 -> 8711 bytes
-rw-r--r--FreeFileSync/Build/Help/img/MainDialog.png (renamed from BUILD/Help/img/MainDialog.png)bin69246 -> 69246 bytes
-rw-r--r--FreeFileSync/Build/Help/img/RTS_logo.png (renamed from BUILD/Help/img/RTS_logo.png)bin6798 -> 6798 bytes
-rw-r--r--FreeFileSync/Build/Help/img/RealtimeSync.png (renamed from BUILD/Help/img/RealtimeSync.png)bin24081 -> 24081 bytes
-rw-r--r--FreeFileSync/Build/Help/img/ScheduleBatch.png (renamed from BUILD/Help/img/ScheduleBatch.png)bin23027 -> 23027 bytes
-rw-r--r--FreeFileSync/Build/Help/img/SetupBatch.png (renamed from BUILD/Help/img/SetupBatch.png)bin19598 -> 19598 bytes
-rw-r--r--FreeFileSync/Build/Help/img/SourceTarget.png (renamed from BUILD/Help/img/SourceTarget.png)bin4649 -> 4649 bytes
-rw-r--r--FreeFileSync/Build/Help/img/SyncConfigButton.png (renamed from BUILD/Help/img/SyncConfigButton.png)bin2530 -> 2530 bytes
-rw-r--r--FreeFileSync/Build/Help/img/SynchronizeButton.png (renamed from BUILD/Help/img/SynchronizeButton.png)bin4943 -> 4943 bytes
-rw-r--r--FreeFileSync/Build/Help/img/VolumeName.png (renamed from BUILD/Help/img/VolumeName.png)bin6095 -> 6095 bytes
-rw-r--r--FreeFileSync/Build/Help/img/WatchUsbInsert.png (renamed from BUILD/Help/img/WatchUsbInsert.png)bin32665 -> 32665 bytes
-rw-r--r--FreeFileSync/Build/Help/img/create_shortcut.png (renamed from BUILD/Help/img/create_shortcut.png)bin16019 -> 16019 bytes
-rw-r--r--FreeFileSync/Build/Help/img/schedule_realtimesync.png (renamed from BUILD/Help/img/schedule_realtimesync.png)bin29315 -> 29315 bytes
-rw-r--r--FreeFileSync/Build/Help/img/shortcut_properties.png (renamed from BUILD/Help/img/shortcut_properties.png)bin30148 -> 30148 bytes
-rw-r--r--FreeFileSync/Build/Help/img/ubuntuScheduler.png (renamed from BUILD/Help/img/ubuntuScheduler.png)bin53376 -> 53376 bytes
-rw-r--r--FreeFileSync/Build/Help/img/win7scheduler.png (renamed from BUILD/Help/img/win7scheduler.png)bin28814 -> 28814 bytes
-rw-r--r--FreeFileSync/Build/Languages/arabic.lng (renamed from BUILD/Languages/arabic.lng)56
-rw-r--r--FreeFileSync/Build/Languages/chinese_simple.lng (renamed from BUILD/Languages/chinese_simple.lng)40
-rw-r--r--FreeFileSync/Build/Languages/chinese_traditional.lng (renamed from BUILD/Languages/chinese_traditional.lng)12
-rw-r--r--FreeFileSync/Build/Languages/croatian.lng (renamed from BUILD/Languages/croatian.lng)640
-rw-r--r--FreeFileSync/Build/Languages/czech.lng (renamed from BUILD/Languages/czech.lng)122
-rw-r--r--FreeFileSync/Build/Languages/danish.lng (renamed from BUILD/Languages/danish.lng)122
-rw-r--r--FreeFileSync/Build/Languages/dutch.lng (renamed from BUILD/Languages/dutch.lng)594
-rw-r--r--FreeFileSync/Build/Languages/english_uk.lng (renamed from BUILD/Languages/english_uk.lng)133
-rw-r--r--FreeFileSync/Build/Languages/finnish.lng (renamed from BUILD/Languages/finnish.lng)47
-rw-r--r--FreeFileSync/Build/Languages/french.lng (renamed from BUILD/Languages/french.lng)122
-rw-r--r--FreeFileSync/Build/Languages/german.lng (renamed from BUILD/Languages/german.lng)117
-rw-r--r--FreeFileSync/Build/Languages/greek.lng (renamed from BUILD/Languages/greek.lng)26
-rw-r--r--FreeFileSync/Build/Languages/hebrew.lng (renamed from BUILD/Languages/hebrew.lng)99
-rw-r--r--FreeFileSync/Build/Languages/hungarian.lng (renamed from BUILD/Languages/hungarian.lng)80
-rw-r--r--FreeFileSync/Build/Languages/italian.lng (renamed from BUILD/Languages/italian.lng)224
-rw-r--r--FreeFileSync/Build/Languages/japanese.lng (renamed from BUILD/Languages/japanese.lng)122
-rw-r--r--FreeFileSync/Build/Languages/korean.lng (renamed from BUILD/Languages/korean.lng)37
-rw-r--r--FreeFileSync/Build/Languages/outdated/lithuanian.lng (renamed from BUILD/Languages/outdated/lithuanian.lng)674
-rw-r--r--FreeFileSync/Build/Languages/outdated/norwegian.lng (renamed from BUILD/Languages/outdated/norwegian.lng)998
-rw-r--r--FreeFileSync/Build/Languages/outdated/turkish.lng (renamed from BUILD/Languages/turkish.lng)594
-rw-r--r--FreeFileSync/Build/Languages/polish.lng (renamed from BUILD/Languages/polish.lng)40
-rw-r--r--FreeFileSync/Build/Languages/portuguese.lng (renamed from BUILD/Languages/portuguese.lng)12
-rw-r--r--FreeFileSync/Build/Languages/portuguese_br.lng (renamed from BUILD/Languages/portuguese_br.lng)100
-rw-r--r--FreeFileSync/Build/Languages/romanian.lng (renamed from BUILD/Languages/romanian.lng)63
-rw-r--r--FreeFileSync/Build/Languages/russian.lng (renamed from BUILD/Languages/russian.lng)47
-rw-r--r--FreeFileSync/Build/Languages/scottish_gaelic.lng (renamed from BUILD/Languages/scottish_gaelic.lng)12
-rw-r--r--FreeFileSync/Build/Languages/serbian.lng (renamed from BUILD/Languages/serbian.lng)16
-rw-r--r--FreeFileSync/Build/Languages/slovenian.lng (renamed from BUILD/Languages/slovenian.lng)26
-rw-r--r--FreeFileSync/Build/Languages/spanish.lng (renamed from BUILD/Languages/spanish.lng)12
-rw-r--r--FreeFileSync/Build/Languages/swedish.lng (renamed from BUILD/Languages/swedish.lng)122
-rw-r--r--FreeFileSync/Build/Languages/ukrainian.lng (renamed from BUILD/Languages/ukrainian.lng)50
-rw-r--r--FreeFileSync/Build/Resources.zip (renamed from BUILD/Resources.zip)bin260187 -> 260256 bytes
-rw-r--r--FreeFileSync/Build/Sync_Complete.wav (renamed from BUILD/Sync_Complete.wav)bin460504 -> 460504 bytes
-rw-r--r--FreeFileSync/Build/styles.gtk_rc (renamed from BUILD/styles.gtk_rc)0
-rw-r--r--FreeFileSync/Source/FreeFileSync.vcxproj (renamed from FreeFileSync.vcxproj)131
-rw-r--r--FreeFileSync/Source/LICENSE621
-rw-r--r--FreeFileSync/Source/Makefile (renamed from Makefile)63
-rw-r--r--FreeFileSync/Source/RealtimeSync/Makefile (renamed from RealtimeSync/makefile)36
-rw-r--r--FreeFileSync/Source/RealtimeSync/RealtimeSync.ico (renamed from RealtimeSync/RealtimeSync.ico)bin111386 -> 111386 bytes
-rw-r--r--FreeFileSync/Source/RealtimeSync/RealtimeSync.vcxproj (renamed from RealtimeSync/RealtimeSync.vcxproj)102
-rw-r--r--FreeFileSync/Source/RealtimeSync/app_icon.h (renamed from RealtimeSync/app_icon.h)0
-rw-r--r--FreeFileSync/Source/RealtimeSync/application.cpp (renamed from RealtimeSync/application.cpp)16
-rw-r--r--FreeFileSync/Source/RealtimeSync/application.h (renamed from RealtimeSync/application.h)1
-rw-r--r--FreeFileSync/Source/RealtimeSync/gui_generated.cpp (renamed from RealtimeSync/gui_generated.cpp)0
-rw-r--r--FreeFileSync/Source/RealtimeSync/gui_generated.h (renamed from RealtimeSync/gui_generated.h)0
-rw-r--r--FreeFileSync/Source/RealtimeSync/main_dlg.cpp (renamed from RealtimeSync/main_dlg.cpp)38
-rw-r--r--FreeFileSync/Source/RealtimeSync/main_dlg.h (renamed from RealtimeSync/main_dlg.h)2
-rw-r--r--FreeFileSync/Source/RealtimeSync/monitor.cpp (renamed from RealtimeSync/monitor.cpp)38
-rw-r--r--FreeFileSync/Source/RealtimeSync/monitor.h (renamed from RealtimeSync/monitor.h)2
-rw-r--r--FreeFileSync/Source/RealtimeSync/tray_menu.cpp (renamed from RealtimeSync/tray_menu.cpp)0
-rw-r--r--FreeFileSync/Source/RealtimeSync/tray_menu.h (renamed from RealtimeSync/tray_menu.h)0
-rw-r--r--FreeFileSync/Source/RealtimeSync/xml_ffs.cpp (renamed from RealtimeSync/xml_ffs.cpp)30
-rw-r--r--FreeFileSync/Source/RealtimeSync/xml_ffs.h (renamed from RealtimeSync/xml_ffs.h)0
-rw-r--r--FreeFileSync/Source/RealtimeSync/xml_proc.cpp (renamed from RealtimeSync/xml_proc.cpp)0
-rw-r--r--FreeFileSync/Source/RealtimeSync/xml_proc.h (renamed from RealtimeSync/xml_proc.h)0
-rw-r--r--FreeFileSync/Source/algorithm.cpp (renamed from algorithm.cpp)5
-rw-r--r--FreeFileSync/Source/algorithm.h (renamed from algorithm.h)0
-rw-r--r--FreeFileSync/Source/application.cpp (renamed from Application.cpp)42
-rw-r--r--FreeFileSync/Source/application.h (renamed from Application.h)0
-rw-r--r--FreeFileSync/Source/comparison.cpp (renamed from comparison.cpp)248
-rw-r--r--FreeFileSync/Source/comparison.h (renamed from comparison.h)12
-rw-r--r--FreeFileSync/Source/dll/IFileDialog_Vista/IFileDialog_Vista.vcxproj (renamed from ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj)123
-rw-r--r--FreeFileSync/Source/dll/IFileDialog_Vista/ifile_dialog.cpp (renamed from ui/IFileDialog_Vista/ifile_dialog.cpp)0
-rw-r--r--FreeFileSync/Source/dll/IFileDialog_Vista/ifile_dialog.h (renamed from ui/IFileDialog_Vista/ifile_dialog.h)0
-rw-r--r--FreeFileSync/Source/dll/ShadowCopy/Shadow_Windows7.vcxproj (renamed from lib/ShadowCopy/Shadow_Windows7.vcxproj)127
-rw-r--r--FreeFileSync/Source/dll/ShadowCopy/shadow.cpp (renamed from lib/ShadowCopy/shadow.cpp)0
-rw-r--r--FreeFileSync/Source/dll/ShadowCopy/shadow.h (renamed from lib/ShadowCopy/shadow.h)0
-rw-r--r--FreeFileSync/Source/dll/Taskbar_Seven/Taskbar_Seven.vcxproj (renamed from ui/Taskbar_Seven/Taskbar_Seven.vcxproj)119
-rw-r--r--FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp (renamed from ui/Taskbar_Seven/taskbar.cpp)0
-rw-r--r--FreeFileSync/Source/dll/Taskbar_Seven/taskbar.h (renamed from ui/Taskbar_Seven/taskbar.h)0
-rw-r--r--FreeFileSync/Source/dll/Thumbnail/Thumbnail.vcxproj (renamed from lib/Thumbnail/Thumbnail.vcxproj)115
-rw-r--r--FreeFileSync/Source/dll/Thumbnail/thumbnail.cpp (renamed from lib/Thumbnail/thumbnail.cpp)0
-rw-r--r--FreeFileSync/Source/dll/Thumbnail/thumbnail.h (renamed from lib/Thumbnail/thumbnail.h)0
-rw-r--r--FreeFileSync/Source/file_hierarchy.cpp (renamed from file_hierarchy.cpp)0
-rw-r--r--FreeFileSync/Source/file_hierarchy.h (renamed from file_hierarchy.h)8
-rw-r--r--FreeFileSync/Source/lib/Batch.ico (renamed from lib/Batch.ico)bin103260 -> 103260 bytes
-rw-r--r--FreeFileSync/Source/lib/FreeFileSync.ico (renamed from lib/FreeFileSync.ico)bin114124 -> 114124 bytes
-rw-r--r--FreeFileSync/Source/lib/SyncDB.ico (renamed from lib/SyncDB.ico)bin111496 -> 111496 bytes
-rw-r--r--FreeFileSync/Source/lib/binary.cpp (renamed from lib/binary.cpp)0
-rw-r--r--FreeFileSync/Source/lib/binary.h (renamed from lib/binary.h)0
-rw-r--r--FreeFileSync/Source/lib/cmp_filetime.h (renamed from lib/cmp_filetime.h)3
-rw-r--r--FreeFileSync/Source/lib/db_file.cpp (renamed from lib/db_file.cpp)0
-rw-r--r--FreeFileSync/Source/lib/db_file.h (renamed from lib/db_file.h)0
-rw-r--r--FreeFileSync/Source/lib/dir_exist_async.h (renamed from lib/dir_exist_async.h)4
-rw-r--r--FreeFileSync/Source/lib/dir_lock.cpp (renamed from lib/dir_lock.cpp)21
-rw-r--r--FreeFileSync/Source/lib/dir_lock.h (renamed from lib/dir_lock.h)0
-rw-r--r--FreeFileSync/Source/lib/error_log.h (renamed from lib/error_log.h)0
-rw-r--r--FreeFileSync/Source/lib/ffs_paths.cpp (renamed from lib/ffs_paths.cpp)0
-rw-r--r--FreeFileSync/Source/lib/ffs_paths.h (renamed from lib/ffs_paths.h)0
-rw-r--r--FreeFileSync/Source/lib/generate_logfile.h (renamed from lib/generate_logfile.h)2
-rw-r--r--FreeFileSync/Source/lib/hard_filter.cpp (renamed from lib/hard_filter.cpp)0
-rw-r--r--FreeFileSync/Source/lib/hard_filter.h (renamed from lib/hard_filter.h)0
-rw-r--r--FreeFileSync/Source/lib/help_provider.h (renamed from lib/help_provider.h)0
-rw-r--r--FreeFileSync/Source/lib/icon_buffer.cpp (renamed from lib/icon_buffer.cpp)156
-rw-r--r--FreeFileSync/Source/lib/icon_buffer.h (renamed from lib/icon_buffer.h)6
-rw-r--r--FreeFileSync/Source/lib/localization.cpp (renamed from lib/localization.cpp)0
-rw-r--r--FreeFileSync/Source/lib/localization.h (renamed from lib/localization.h)0
-rw-r--r--FreeFileSync/Source/lib/lock_holder.h (renamed from lib/lock_holder.h)3
-rw-r--r--FreeFileSync/Source/lib/norm_filter.h (renamed from lib/norm_filter.h)0
-rw-r--r--FreeFileSync/Source/lib/osx_file_icon.h (renamed from lib/osx_file_icon.h)0
-rw-r--r--FreeFileSync/Source/lib/osx_file_icon.mm (renamed from lib/osx_file_icon.mm)0
-rw-r--r--FreeFileSync/Source/lib/parallel_scan.cpp (renamed from lib/parallel_scan.cpp)0
-rw-r--r--FreeFileSync/Source/lib/parallel_scan.h (renamed from lib/parallel_scan.h)0
-rw-r--r--FreeFileSync/Source/lib/parse_lng.h (renamed from lib/parse_lng.h)0
-rw-r--r--FreeFileSync/Source/lib/parse_plural.h (renamed from lib/parse_plural.h)0
-rw-r--r--FreeFileSync/Source/lib/perf_check.cpp (renamed from lib/perf_check.cpp)21
-rw-r--r--FreeFileSync/Source/lib/perf_check.h (renamed from lib/perf_check.h)15
-rw-r--r--FreeFileSync/Source/lib/process_xml.cpp (renamed from lib/process_xml.cpp)38
-rw-r--r--FreeFileSync/Source/lib/process_xml.h (renamed from lib/process_xml.h)2
-rw-r--r--FreeFileSync/Source/lib/resolve_path.cpp (renamed from lib/resolve_path.cpp)0
-rw-r--r--FreeFileSync/Source/lib/resolve_path.h (renamed from lib/resolve_path.h)0
-rw-r--r--FreeFileSync/Source/lib/return_codes.h (renamed from lib/return_codes.h)0
-rw-r--r--FreeFileSync/Source/lib/shadow.cpp (renamed from lib/shadow.cpp)2
-rw-r--r--FreeFileSync/Source/lib/shadow.h (renamed from lib/shadow.h)0
-rw-r--r--FreeFileSync/Source/lib/soft_filter.h (renamed from lib/soft_filter.h)0
-rw-r--r--FreeFileSync/Source/lib/status_handler.cpp (renamed from lib/status_handler.cpp)0
-rw-r--r--FreeFileSync/Source/lib/status_handler.h (renamed from lib/status_handler.h)15
-rw-r--r--FreeFileSync/Source/lib/status_handler_impl.h (renamed from lib/status_handler_impl.h)2
-rw-r--r--FreeFileSync/Source/lib/versioning.cpp (renamed from lib/versioning.cpp)0
-rw-r--r--FreeFileSync/Source/lib/versioning.h (renamed from lib/versioning.h)0
-rw-r--r--FreeFileSync/Source/lib/xml_base.cpp (renamed from lib/xml_base.cpp)0
-rw-r--r--FreeFileSync/Source/lib/xml_base.h (renamed from lib/xml_base.h)0
-rw-r--r--FreeFileSync/Source/process_callback.h (renamed from process_callback.h)2
-rw-r--r--FreeFileSync/Source/structures.cpp (renamed from structures.cpp)2
-rw-r--r--FreeFileSync/Source/structures.h (renamed from structures.h)16
-rw-r--r--FreeFileSync/Source/synchronization.cpp (renamed from synchronization.cpp)445
-rw-r--r--FreeFileSync/Source/synchronization.h (renamed from synchronization.h)0
-rw-r--r--FreeFileSync/Source/ui/app_icon.h (renamed from ui/app_icon.h)0
-rw-r--r--FreeFileSync/Source/ui/batch_config.cpp (renamed from ui/batch_config.cpp)0
-rw-r--r--FreeFileSync/Source/ui/batch_config.h (renamed from ui/batch_config.h)0
-rw-r--r--FreeFileSync/Source/ui/batch_status_handler.cpp (renamed from ui/batch_status_handler.cpp)29
-rw-r--r--FreeFileSync/Source/ui/batch_status_handler.h (renamed from ui/batch_status_handler.h)7
-rw-r--r--FreeFileSync/Source/ui/check_version.cpp (renamed from ui/check_version.cpp)0
-rw-r--r--FreeFileSync/Source/ui/check_version.h (renamed from ui/check_version.h)0
-rw-r--r--FreeFileSync/Source/ui/column_attr.h (renamed from ui/column_attr.h)16
-rw-r--r--FreeFileSync/Source/ui/custom_grid.cpp (renamed from ui/custom_grid.cpp)113
-rw-r--r--FreeFileSync/Source/ui/custom_grid.h (renamed from ui/custom_grid.h)1
-rw-r--r--FreeFileSync/Source/ui/dir_name.cpp (renamed from ui/dir_name.cpp)2
-rw-r--r--FreeFileSync/Source/ui/dir_name.h (renamed from ui/dir_name.h)0
-rw-r--r--FreeFileSync/Source/ui/exec_finished_box.cpp (renamed from ui/exec_finished_box.cpp)0
-rw-r--r--FreeFileSync/Source/ui/exec_finished_box.h (renamed from ui/exec_finished_box.h)0
-rw-r--r--FreeFileSync/Source/ui/folder_history_box.cpp (renamed from ui/folder_history_box.cpp)0
-rw-r--r--FreeFileSync/Source/ui/folder_history_box.h (renamed from ui/folder_history_box.h)0
-rw-r--r--FreeFileSync/Source/ui/folder_history_types.h (renamed from ui/folder_history_types.h)0
-rw-r--r--FreeFileSync/Source/ui/folder_pair.h (renamed from ui/folder_pair.h)0
-rw-r--r--FreeFileSync/Source/ui/grid_view.cpp (renamed from ui/grid_view.cpp)0
-rw-r--r--FreeFileSync/Source/ui/grid_view.h (renamed from ui/grid_view.h)2
-rw-r--r--FreeFileSync/Source/ui/gui_generated.cpp3499
-rw-r--r--FreeFileSync/Source/ui/gui_generated.h880
-rw-r--r--FreeFileSync/Source/ui/gui_status_handler.cpp (renamed from ui/gui_status_handler.cpp)28
-rw-r--r--FreeFileSync/Source/ui/gui_status_handler.h (renamed from ui/gui_status_handler.h)10
-rw-r--r--FreeFileSync/Source/ui/main_dlg.cpp (renamed from ui/main_dlg.cpp)309
-rw-r--r--FreeFileSync/Source/ui/main_dlg.h (renamed from ui/main_dlg.h)0
-rw-r--r--FreeFileSync/Source/ui/osx_dock.h (renamed from ui/osx_dock.h)0
-rw-r--r--FreeFileSync/Source/ui/osx_dock.mm (renamed from ui/osx_dock.mm)0
-rw-r--r--FreeFileSync/Source/ui/progress_indicator.cpp (renamed from ui/progress_indicator.cpp)227
-rw-r--r--FreeFileSync/Source/ui/progress_indicator.h (renamed from ui/progress_indicator.h)0
-rw-r--r--FreeFileSync/Source/ui/search.cpp (renamed from ui/search.cpp)3
-rw-r--r--FreeFileSync/Source/ui/search.h (renamed from ui/search.h)0
-rw-r--r--FreeFileSync/Source/ui/small_dlgs.cpp (renamed from ui/small_dlgs.cpp)31
-rw-r--r--FreeFileSync/Source/ui/small_dlgs.h (renamed from ui/small_dlgs.h)0
-rw-r--r--FreeFileSync/Source/ui/sorting.h (renamed from ui/sorting.h)0
-rw-r--r--FreeFileSync/Source/ui/switch_to_gui.h (renamed from ui/switch_to_gui.h)0
-rw-r--r--FreeFileSync/Source/ui/sync_cfg.cpp (renamed from ui/sync_cfg.cpp)0
-rw-r--r--FreeFileSync/Source/ui/sync_cfg.h (renamed from ui/sync_cfg.h)0
-rw-r--r--FreeFileSync/Source/ui/taskbar.cpp (renamed from ui/taskbar.cpp)2
-rw-r--r--FreeFileSync/Source/ui/taskbar.h (renamed from ui/taskbar.h)0
-rw-r--r--FreeFileSync/Source/ui/tray_icon.cpp (renamed from ui/tray_icon.cpp)0
-rw-r--r--FreeFileSync/Source/ui/tray_icon.h (renamed from ui/tray_icon.h)0
-rw-r--r--FreeFileSync/Source/ui/tree_view.cpp (renamed from ui/tree_view.cpp)175
-rw-r--r--FreeFileSync/Source/ui/tree_view.h (renamed from ui/tree_view.h)6
-rw-r--r--FreeFileSync/Source/ui/triple_splitter.cpp (renamed from ui/triple_splitter.cpp)0
-rw-r--r--FreeFileSync/Source/ui/triple_splitter.h (renamed from ui/triple_splitter.h)0
-rw-r--r--FreeFileSync/Source/ui/wx_form_build_hide_warnings.h (renamed from ui/wx_form_build_hide_warnings.h)0
-rw-r--r--FreeFileSync/Source/version/version.h (renamed from version/version.h)2
-rw-r--r--ui/gui_generated.cpp3505
-rw-r--r--ui/gui_generated.h880
-rw-r--r--wx+/font_size.h2
-rw-r--r--wx+/graph.cpp10
-rw-r--r--wx+/grid.cpp767
-rw-r--r--wx+/grid.h137
-rw-r--r--wx+/popup_dlg.cpp8
-rw-r--r--wx+/popup_dlg_generated.cpp146
-rw-r--r--wx+/popup_dlg_generated.h56
-rw-r--r--zen/FindFilePlus/FindFilePlus.vcxproj131
-rw-r--r--zen/IFileOperation/FileOperation.vcxproj (renamed from zen/IFileOperation/FileOperation_Vista.vcxproj)119
-rw-r--r--zen/debug_minidump.h4
-rw-r--r--zen/dir_watcher.cpp12
-rw-r--r--zen/file_handling.cpp225
-rw-r--r--zen/file_handling.h4
-rw-r--r--zen/file_id.cpp65
-rw-r--r--zen/file_id.h22
-rw-r--r--zen/file_traverser.cpp2
-rw-r--r--zen/fixed_list.h46
-rw-r--r--zen/format_unit.cpp7
-rw-r--r--zen/int64.h2
-rw-r--r--zen/recycler.cpp6
-rw-r--r--zenXml/Changelog.txt79
-rw-r--r--zenxml/LICENSE_1_0.txt23
-rw-r--r--zenxml/doc/annotated.html120
-rw-r--r--zenxml/doc/bc_s.pngbin0 -> 705 bytes
-rw-r--r--zenxml/doc/bdwn.pngbin0 -> 147 bytes
-rw-r--r--zenxml/doc/bind_8h_source.html319
-rw-r--r--zenxml/doc/classes.html120
-rw-r--r--zenxml/doc/classzen_1_1_xml_doc-members.html128
-rw-r--r--zenxml/doc/classzen_1_1_xml_doc.html353
-rw-r--r--zenxml/doc/classzen_1_1_xml_element-members.html133
-rw-r--r--zenxml/doc/classzen_1_1_xml_element.html552
-rw-r--r--zenxml/doc/classzen_1_1_xml_in-members.html129
-rw-r--r--zenxml/doc/classzen_1_1_xml_in.html446
-rw-r--r--zenxml/doc/classzen_1_1_xml_out-members.html124
-rw-r--r--zenxml/doc/classzen_1_1_xml_out.html317
-rw-r--r--zenxml/doc/closed.pngbin0 -> 126 bytes
-rw-r--r--zenxml/doc/cvrt__struc_8h_source.html305
-rw-r--r--zenxml/doc/cvrt__text_8h_source.html276
-rw-r--r--zenxml/doc/dom_8h_source.html346
-rw-r--r--zenxml/doc/doxygen.css1012
-rw-r--r--zenxml/doc/doxygen.pngbin0 -> 3942 bytes
-rw-r--r--zenxml/doc/error_8h_source.html126
-rw-r--r--zenxml/doc/files.html118
-rw-r--r--zenxml/doc/functions.html272
-rw-r--r--zenxml/doc/functions_func.html253
-rw-r--r--zenxml/doc/functions_vars.html125
-rw-r--r--zenxml/doc/hierarchy.html122
-rw-r--r--zenxml/doc/index.html679
-rw-r--r--zenxml/doc/io_8h_source.html213
-rw-r--r--zenxml/doc/jquery.js64
-rw-r--r--zenxml/doc/namespacemembers.html143
-rw-r--r--zenxml/doc/namespacemembers_func.html143
-rw-r--r--zenxml/doc/namespaces.html112
-rw-r--r--zenxml/doc/namespacezen.html613
-rw-r--r--zenxml/doc/nav_f.pngbin0 -> 159 bytes
-rw-r--r--zenxml/doc/nav_h.pngbin0 -> 97 bytes
-rw-r--r--zenxml/doc/open.pngbin0 -> 118 bytes
-rw-r--r--zenxml/doc/parser_8h_source.html687
-rw-r--r--zenxml/doc/search/all_61.html25
-rw-r--r--zenxml/doc/search/all_61.js5
-rw-r--r--zenxml/doc/search/all_63.html25
-rw-r--r--zenxml/doc/search/all_63.js4
-rw-r--r--zenxml/doc/search/all_65.html25
-rw-r--r--zenxml/doc/search/all_65.js4
-rw-r--r--zenxml/doc/search/all_67.html25
-rw-r--r--zenxml/doc/search/all_67.js13
-rw-r--r--zenxml/doc/search/all_6c.html25
-rw-r--r--zenxml/doc/search/all_6c.js6
-rw-r--r--zenxml/doc/search/all_6e.html25
-rw-r--r--zenxml/doc/search/all_6e.js4
-rw-r--r--zenxml/doc/search/all_6f.html25
-rw-r--r--zenxml/doc/search/all_6f.js6
-rw-r--r--zenxml/doc/search/all_70.html25
-rw-r--r--zenxml/doc/search/all_70.js5
-rw-r--r--zenxml/doc/search/all_72.html25
-rw-r--r--zenxml/doc/search/all_72.js9
-rw-r--r--zenxml/doc/search/all_73.html25
-rw-r--r--zenxml/doc/search/all_73.js11
-rw-r--r--zenxml/doc/search/all_77.html25
-rw-r--r--zenxml/doc/search/all_77.js5
-rw-r--r--zenxml/doc/search/all_78.html25
-rw-r--r--zenxml/doc/search/all_78.js13
-rw-r--r--zenxml/doc/search/all_7a.html25
-rw-r--r--zenxml/doc/search/all_7a.js4
-rw-r--r--zenxml/doc/search/classes_78.html25
-rw-r--r--zenxml/doc/search/classes_78.js10
-rw-r--r--zenxml/doc/search/close.pngbin0 -> 273 bytes
-rw-r--r--zenxml/doc/search/functions_61.html25
-rw-r--r--zenxml/doc/search/functions_61.js5
-rw-r--r--zenxml/doc/search/functions_65.html25
-rw-r--r--zenxml/doc/search/functions_65.js4
-rw-r--r--zenxml/doc/search/functions_67.html25
-rw-r--r--zenxml/doc/search/functions_67.js13
-rw-r--r--zenxml/doc/search/functions_6c.html25
-rw-r--r--zenxml/doc/search/functions_6c.js5
-rw-r--r--zenxml/doc/search/functions_6e.html25
-rw-r--r--zenxml/doc/search/functions_6e.js4
-rw-r--r--zenxml/doc/search/functions_6f.html25
-rw-r--r--zenxml/doc/search/functions_6f.js6
-rw-r--r--zenxml/doc/search/functions_70.html25
-rw-r--r--zenxml/doc/search/functions_70.js5
-rw-r--r--zenxml/doc/search/functions_72.html25
-rw-r--r--zenxml/doc/search/functions_72.js8
-rw-r--r--zenxml/doc/search/functions_73.html25
-rw-r--r--zenxml/doc/search/functions_73.js11
-rw-r--r--zenxml/doc/search/functions_77.html25
-rw-r--r--zenxml/doc/search/functions_77.js5
-rw-r--r--zenxml/doc/search/functions_78.html25
-rw-r--r--zenxml/doc/search/functions_78.js6
-rw-r--r--zenxml/doc/search/mag_sel.pngbin0 -> 563 bytes
-rw-r--r--zenxml/doc/search/namespaces_7a.html25
-rw-r--r--zenxml/doc/search/namespaces_7a.js4
-rw-r--r--zenxml/doc/search/nomatches.html12
-rw-r--r--zenxml/doc/search/search.css238
-rw-r--r--zenxml/doc/search/search.js803
-rw-r--r--zenxml/doc/search/search_l.pngbin0 -> 604 bytes
-rw-r--r--zenxml/doc/search/search_m.pngbin0 -> 158 bytes
-rw-r--r--zenxml/doc/search/search_r.pngbin0 -> 612 bytes
-rw-r--r--zenxml/doc/search/variables_63.html25
-rw-r--r--zenxml/doc/search/variables_63.js4
-rw-r--r--zenxml/doc/search/variables_6c.html25
-rw-r--r--zenxml/doc/search/variables_6c.js4
-rw-r--r--zenxml/doc/search/variables_72.html25
-rw-r--r--zenxml/doc/search/variables_72.js4
-rw-r--r--zenxml/doc/structzen_1_1_xml_error-members.html118
-rw-r--r--zenxml/doc/structzen_1_1_xml_error.html136
-rw-r--r--zenxml/doc/structzen_1_1_xml_error.pngbin0 -> 668 bytes
-rw-r--r--zenxml/doc/structzen_1_1_xml_file_error-members.html119
-rw-r--r--zenxml/doc/structzen_1_1_xml_file_error.html144
-rw-r--r--zenxml/doc/structzen_1_1_xml_file_error.pngbin0 -> 447 bytes
-rw-r--r--zenxml/doc/structzen_1_1_xml_parsing_error-members.html120
-rw-r--r--zenxml/doc/structzen_1_1_xml_parsing_error.html147
-rw-r--r--zenxml/doc/structzen_1_1_xml_parsing_error.pngbin0 -> 500 bytes
-rw-r--r--zenxml/doc/tab_a.pngbin0 -> 140 bytes
-rw-r--r--zenxml/doc/tab_b.pngbin0 -> 178 bytes
-rw-r--r--zenxml/doc/tab_h.pngbin0 -> 192 bytes
-rw-r--r--zenxml/doc/tab_s.pngbin0 -> 189 bytes
-rw-r--r--zenxml/doc/tabs.css59
-rw-r--r--zenxml/doc/xml_8h_source.html122
-rw-r--r--zenxml/summary.dox684
-rw-r--r--zenxml/zenxml/bind.h (renamed from zenxml/bind.h)0
-rw-r--r--zenxml/zenxml/cvrt_struc.h (renamed from zenxml/cvrt_struc.h)0
-rw-r--r--zenxml/zenxml/cvrt_text.h (renamed from zenxml/cvrt_text.h)0
-rw-r--r--zenxml/zenxml/dom.h (renamed from zenxml/dom.h)0
-rw-r--r--zenxml/zenxml/error.h (renamed from zenxml/error.h)0
-rw-r--r--zenxml/zenxml/io.h (renamed from zenxml/io.h)0
-rw-r--r--zenxml/zenxml/parser.h (renamed from zenxml/parser.h)0
-rw-r--r--zenxml/zenxml/unit_test.cpp (renamed from zenxml/unit_test.cpp)0
-rw-r--r--zenxml/zenxml/xml.h (renamed from zenxml/xml.h)0
382 files changed, 22627 insertions, 11892 deletions
diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm
deleted file mode 100644
index 353494e5..00000000
--- a/BUILD/FreeFileSync.chm
+++ /dev/null
Binary files differ
diff --git a/BUILD/Help/html/Command line.html b/BUILD/Help/html/Command line.html
deleted file mode 100644
index 56d6ce13..00000000
--- a/BUILD/Help/html/Command line.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.4.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130722;18174509">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Command Line Usage</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
-enables additional synchronization scenarios via a command line interface. To get a syntax overview, open the console, go to the directory where FreeFileSync is installed and type:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace">FreeFileSync
- -h</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>1.
-Run a FreeFileSync batch job</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In order to start synchronization in batch mode, supply the path of a ffs_batch
-configuration file as the first argument for FreeFileSync.exe:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace">FreeFileSync
- &quot;D:\Backup Projects.ffs_batch&quot;</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">After
-synchronization one of the following status codes is returned:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen6" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><SPAN STYLE="font-variant: normal"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Return
- Codes</B></SPAN></FONT></SPAN><SPAN STYLE="font-variant: normal"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><BR>0
- - Synchronization completed successfully<BR>1 - Synchronization
- completed with warnings<BR>2 - Synchronization completed with
- errors<BR>3 - Synchronization was aborted</SPAN></FONT></SPAN>
- </P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif">
-You can evaluate these codes from a script (e.g. a cmd or bat file on Windows)
-and check if synchronization completed successfully:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen6" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace">&quot;C:\Program
- Files\FreeFileSync\FreeFileSync.exe&quot; &quot;D:\Backup Projects.ffs_batch&quot;<BR>
- if errorlevel 1 (<BR>
- &nbsp;&nbsp;<FONT COLOR="#808080"><I><B>::if return code is 1 or greater, something went wrong, add special treatment here<BR>
- &nbsp;&nbsp;</B></I></FONT>echo Errors occurred during synchronization...<BR>
- &nbsp;&nbsp;pause<BR>
- )</FONT>
- </P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Instead
-of displaying &quot;An error occurred!&quot; you can also send an
-email notification (using a third party tool).</FONT>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
-<P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif"><B>Attention<BR></B>Make
- sure your script is not blocked by a popup dialog. Consider the
- following options when setting up a FreeFileSync batch job:</FONT>
- </P>
-
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Disable
- checkbox <B>Show
- progress dialog</B> or have <B>On completion</B>
- automatically close the results dialog after synchronization.</FONT>
- </P>
-
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Set error handling to <B>Stop</B> or <B>Ignore</B>.</FONT>
- </P>
-
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>2.
-Start a FreeFileSync GUI configuration</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If you
-pass a ffs_gui file, FreeFileSync will start in GUI mode and immediately start comparison (but only if all directories exist):</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace">FreeFileSync &quot;D:\Manual Backup.ffs_gui&quot;</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>3.
-Customize an existing configuration</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">You can replace the directories of a given ffs_gui or ffs_batch configuration file by using the <FONT FACE="Courier New, monospace">-leftdir</FONT>
-and <FONT FACE="Courier New, monospace">-rightdir</FONT> parameters:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Courier New, monospace">FreeFileSync &quot;D:\Manual Backup.ffs_gui&quot; -leftdir C:\NewSource -rightdir D:\NewTarget</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>4. Merge multiple configurations</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">When
-more than one configuration file is provided, FreeFileSync will merge
-everything into a single configuration with multiple folder pairs and
-start in GUI mode:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen7" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Courier New, monospace">FreeFileSync &quot;D:\Manual Backup.ffs_gui&quot; &quot;D:\Backup Projects.ffs_batch&quot;</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Comparison Settings.html b/BUILD/Help/html/Comparison Settings.html
deleted file mode 100644
index 132cb15e..00000000
--- a/BUILD/Help/html/Comparison Settings.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1 (Win32)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130206;19283574">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Comparison Settings</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><IMG SRC="../img/CmpSettings.png" NAME="Grafik1" ALIGN=BOTTOM BORDER=0></P>
-<H3 CLASS="western" STYLE="page-break-after: avoid"><FONT FACE="Tahoma, sans-serif">I. Compare by <i>File time and size</i></FONT></H3>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">This
-variant considers two files with the same name as equal when both
-modification time <B>and</B> file size match. The following
-categories are distinguished:</FONT></P>
-<OL TYPE=i>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>file
- exists on one side only</B></FONT></P>
- <OL TYPE=i>
- <UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left
- only</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right
- only</FONT></P>
- </UL>
- </OL>
- <LI><P STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif"><B>file
- exists on both sides</B></FONT></P>
- <OL TYPE=i>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>different
- date</B></FONT></P>
- <UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left
- newer</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right
- newer</FONT></P>
- </UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>same
- date</B></FONT></P>
- <UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">equal</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">conflict
- (same date, different size)</FONT></P>
- </UL>
- </OL>
-</OL>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<H3 CLASS="western" STYLE="page-break-after: avoid"><FONT FACE="Tahoma, sans-serif">II. Compare by <i>File content</i></FONT></H3>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Two
-files with the same name are marked as equal if and only if they have
-the same content. This option is more useful for consistency checks
-rather than backup operations since it is naturally slower. The file
-modification time is not taken into account at all.</FONT></P>
-<OL TYPE=i>
- <LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>file
- exists on one side only</B></FONT></P>
- <OL TYPE=a>
- <UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left
- only</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right
- only</FONT></P>
- </UL>
- </OL>
- <LI><P STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif"><B>file
- exists on both sides</B></FONT></P>
- <OL TYPE=a>
- <UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">equal</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">different
- content</FONT></P>
- </UL>
- </OL>
-</OL>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Symbolic Link Handling</FONT></H3>
-<BR>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
-offers three options to configure handling of symbolic links (also
-called symlinks or soft links):</FONT></P>
-<OL>
- <LI><P STYLE="margin-bottom: 0cm"><SPAN STYLE="text-decoration: none"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Exclude:</B></SPAN></FONT></SPAN>
- <FONT FACE="Tahoma, sans-serif">Skip symbolic links while scanning
- directories.<BR></FONT>&nbsp;</P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Direct:</B></FONT>
- <FONT FACE="Tahoma, sans-serif">Evaluate the symbolic link object
- directly. Symbolic links will be shown as a separate entity on grid.
- Links pointing to directories are not traversed and the link object
- is copied directly during synchronization. <BR></FONT>&nbsp;</P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Follow:</B></SPAN>
- Treat symbolic links like the object they are pointing to. Links
- pointing to directories are traversed like ordinary directories and
- the target of each link is copied during synchronization.</FONT></P>
-</OL>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Under
- Windows the symbolic link options apply to symbolic lin<SPAN STYLE="font-style: normal">ks,
- volume mount points and NTFS junction points.</SPAN></FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm; font-style: normal">
- <FONT FACE="Tahoma, sans-serif">Copying symbolic links requires
- FreeFileSync to be started with administrator rights.</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Daylight Saving Time.html b/BUILD/Help/html/Daylight Saving Time.html
deleted file mode 100644
index 8cc5601c..00000000
--- a/BUILD/Help/html/Daylight Saving Time.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1 (Win32)">
- <META NAME="CREATED" CONTENT="20091208;20054200">
- <META NAME="CHANGED" CONTENT="20130206;18224323">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt"><SPAN STYLE="font-style: normal">Daylight Saving Time </SPAN><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">(Windows)</SPAN></SPAN></FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">A
-common problem synchronization software has to handle are +-1 hour
-file time shifts after a Daylight Saving Time (DST) switch has
-occurred. This can be observed for example when a FAT-formatted
-volume is compared against an NTFS volume as is the case when synchronizing a local disk against a
-USB memory stick. Files that previously appeared to be in sync are
-now shown with an one hour modification time offset, although they
-have not been modified by the user or the operating system.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The
-reason for this behavior lies in the way NTFS and FAT drives
-store file times: NTFS stores time in UTC format, while FAT uses
-local time.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">When
-times of these two different formats are compared, one format
-has to be converted into the other first. In either way Windows uses
-the current DST status as well as the current time zone for
-its calculations. Consequently the result of this comparison is
-dependent from current system settings and in particular file times
-that used to be the same can show up as different after a DST switch or when the time zone is changed.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">For a
-detailed discussion about this issue refer to:
-<A HREF="http://www.codeproject.com/KB/datetime/dstbugs.aspx">http://www.codeproject.com/KB/datetime/dstbugs.aspx</A></FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Solution:</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
-FreeFileSync automatically handles this problem by adding the missing time information. Each file on a
-FAT volume automatically gets additional meta data encoded in its
-creation date that enables a correct file time calculation. This not
-only solves all DST issues but also time shifts that occur due to
-travel between different time zones.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
- order for FreeFileSync to start handling DST and timezone
- differences, an initial full synchronization is required.
- Subsequent syncs will then never show a time difference again for unchanged files.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm; font-style: normal">
- <FONT FACE="Tahoma, sans-serif">If a FAT volume is scanned the
- first time by FreeFileSync this will take longer than usual since
- additional meta data is written for each file.</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Exclude Items.html b/BUILD/Help/html/Exclude Items.html
deleted file mode 100644
index d14055fd..00000000
--- a/BUILD/Help/html/Exclude Items.html
+++ /dev/null
@@ -1,147 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.2.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130418;20440768">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- TD P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Exclude Items</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Files
-and directories are only considered for synchronization if they pass
-all filter rules. They have to match <B>at least one</B> entry in the
-include list and <B>none</B> of the entries in the exclude list:</FONT></P>
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; border: none; padding: 0cm; background: #e6e6e6">
- <LI><P STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Each
- list item must be a file or directory path </FONT><FONT FACE="Tahoma, sans-serif"><B>relative</B></FONT>
- <FONT FACE="Tahoma, sans-serif">to synchronization base directories.</FONT></P>
- <LI><P STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Multiple
- items must be separated by <B>;</B> or a new line.</FONT></P>
- <LI><P STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Wild
- cards <B>*</B> and <B>?</B> may be used: <B>*</B> means zero or more
- characters while <B>?</B> represents exactly one character.</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT>
-<FONT FACE="Tahoma, sans-serif">Exclude items for mirror-sync from <FONT FACE="Courier New, monospace">C:\Source</FONT> to <FONT FACE="Courier New, monospace">D:\Target</FONT></FONT>
-</P>
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; border: none; padding: 0cm; background: #e6e6e6">
- <TABLE DIR="LTR" WIDTH=100% CELLPADDING=0 CELLSPACING=0>
- <TR>
- <TD WIDTH=65% STYLE="border-top: none; border-bottom: 2px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif"><B>Description</B></FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 2px solid #000000; border-left: 1.00pt solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif"><B>Exclude</B></FONT></P>
- </TD>
- </TR>
- <TR>
- <TD WIDTH=65% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">Single file
- <FONT FACE="Courier New, monospace">C:\Source\file.txt</FONT></FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">\file.txt</FONT></P>
- </TD>
- </TR>
- <TR>
- <TD WIDTH=65% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">Single folder
- <FONT FACE="Courier New, monospace">C:\Source\SubFolder</FONT></FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">\SubFolder\</FONT></P>
- </TD>
- </TR>
- <TR>
- <TD WIDTH=65% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">All files (and folders) named <FONT FACE="Courier New, monospace">thumbs.db</FONT>
- </FONT>
- </P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">*\thumbs.db</FONT></P>
- </TD>
- </TR>
- <TR>
- <TD WIDTH=65% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">All <FONT FACE="Courier New, monospace">*.tmp</FONT> files located in <FONT FACE="Courier New, monospace">SubFolder</FONT> only</FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">\SubFolder\*.tmp</FONT></P>
- </TD>
- </TR>
- <TR>
- <TD WIDTH=65% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">Files and folders containing <FONT FACE="Courier New, monospace">temp</FONT> somewhere in their path</FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.05cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">*temp*</FONT></P>
- </TD>
- </TR>
- <TR>
- <TD WIDTH=65% STYLE="border-bottom: 1px solid #000000; padding: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">Multiple entries separated by semicolon</FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">*.tmp; *.doc;
- *.bak</FONT></P>
- </TD>
- </TR>
-
- <TR>
- <TD WIDTH=65% STYLE="border-bottom: 1px solid #000000; padding: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">Exclude all files and folders located in subdirectories of base directories</FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">\*\*</FONT></P>
- </TD>
- </TR>
- <TR>
- <TD WIDTH=65% STYLE="border: none; padding: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Tahoma, sans-serif">Exclude only <FONT FACE="Courier New, monospace">*.txt</FONT> files located in subdirectories of base directories</FONT></P>
- </TD>
- <TD WIDTH=35% STYLE="border-top: none; border-bottom: none; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0cm; padding-left: 0.05cm; padding-right: 0cm">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm"><FONT FACE="Courier New, monospace">\*\*.txt</FONT></P>
- </TD>
- </TR>
-
-
- </TABLE>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-
-<BR>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">For
- simple exclusions just right-click and exclude one item or a list
- of items directly on main grid via context menu.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm; font-variant: normal; font-style: normal">
- <FONT FACE="Tahoma, sans-serif">A filter phrase is compared against
- both file and directory paths. If you want to consider directories
- only, you can give a hint by appending a path separator (<B>\</B>).</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Expert settings.html b/BUILD/Help/html/Expert settings.html
deleted file mode 100644
index b0ffb459..00000000
--- a/BUILD/Help/html/Expert settings.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.2.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130420;15194465">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- A:link { so-language: zxx }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Expert Settings</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
-has a number of special purpose settings that can only be accessed
-directly via the global configuration file <FONT FACE="Courier New, monospace">GlobalSettings.xml</FONT>.
-To locate this file enter <FONT FACE="Courier New, monospace">%appdata%\FreeFileSync</FONT> in the Windows Explorer address bar or go to the FreeFileSync
-installation folder if you are using the portable installation.</FONT></P>
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen6" DIR="LTR" STYLE="float: left; width: 80%; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Courier New, monospace">
- &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<BR>
- &lt;FreeFileSync XmlType=&quot;GLOBAL&quot;&gt;<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&lt;Shared&gt;<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>FileTimeTolerance</B> Seconds=&quot;2&quot;/&gt;<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>RunWithBackgroundPriority</B> Enabled=&quot;false&quot;/&gt;<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>LockDirectoriesDuringSync</B> Enabled=&quot;true&quot;/&gt;<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>VerifyCopiedFiles</B> Enabled=&quot;false&quot;/&gt;<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>LastSyncsLogSizeMax</B> Bytes=&quot;100000&quot;/&gt;
- </FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>FileTimeTolerance:</B></FONT><BR><FONT FACE="Tahoma, sans-serif">By
-default file modification</FONT> <FONT FACE="Tahoma, sans-serif">times
-are allowed to have a 2 second difference while still being
-considered equal. This is required by FAT/FAT32 file systems which
-store file times with a 2 second precision only.<BR>This setting
-can also be used to simulate a &quot;compare by file size&quot;,
-ignoring last modification times: If tolerance is set to some high
-value, e.g. 2000000000, then changed files will be detected as a
-conflict (same date, different file size) and the
-synchronization direction for conflicts can be set accordingly.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>RunWithBackgroundPriority:</B></FONT><BR><FONT FACE="Tahoma, sans-serif">While
-synchronization is running, other applications which are accessing the same
-data locations may experience a noticeable slowdown. Enable this
-setting to lower FreeFileSync's resource consumption at the cost of a
-significantly slower synchronization speed.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>LockDirectoriesDuringSync:</B></FONT><BR><FONT FACE="Tahoma, sans-serif">In
-order to avoid race conditions of multiple FreeFileSync instances
-writing to the same folder at the same time, accesses are serialized
-by lock files (<FONT FACE="Courier New, monospace">sync.ffs_lock</FONT>).
-This allows to operate FreeFileSync with an arbitrary number of users
-in a network out of the box.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>VerifyCopiedFiles:</B></FONT><BR><FONT FACE="Tahoma, sans-serif">If
-active, FreeFileSync will binary-compare source and target files after
-copying and report verification errors. Note that this may double
-file copy times and is no guarantee that data has not already been
-corrupted prior to copying and corruption is not hidden by
-deceptively reading valid data from various buffers in the
-application and hardware stack.</FONT><BR><A HREF="http://blogs.msdn.com/b/oldnewthing/archive/2012/09/19/10350645.aspx"><FONT FACE="Tahoma, sans-serif">Does
-the CopyFile function verify that the data reached its final
-destination successfully?</FONT></A></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>LastSyncsLogSizeMax:<BR></B></FONT><FONT FACE="Tahoma, sans-serif">The
-progress logs of the most recent synchronizations (for both GUI and batch jobs) are collected automatically in the file <FONT FACE="Courier New, monospace">LastSyncs.log</FONT>.
-The maximum size of this log file can be set here.</FONT></P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/External Applications.html b/BUILD/Help/html/External Applications.html
deleted file mode 100644
index e4ccdbaf..00000000
--- a/BUILD/Help/html/External Applications.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1 (Win32)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130206;19555336">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">External Applications</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
-When you double-click on one of the rows on the main dialog, FreeFileSync opens the operating system's file browser by default. On Windows it calls <FONT FACE="Courier New, monospace">explorer /select, &quot;%item_path%&quot;</FONT>, on Linux <FONT FACE="Courier New, monospace">xdg-open &quot;%item_folder%&quot;</FONT> and on OS X <FONT FACE="Courier New, monospace">open -R &quot;%item_path%&quot;</FONT>.
-</FONT>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">You can customize this behavior and integrate other external applications into FreeFileSync:
-Navigate to </FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Menu
-&rarr; Tools &rarr; Global settings: Customize context menu</B></SPAN></FONT>
-<FONT FACE="Tahoma, sans-serif">and add or replace a command. The first entry is executed when double-clicking a row on main grid or pressing ENTER while all other entries can be accessed via the
-context menu shown after a right mouse click. The following macros
-can be used:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Courier New, monospace">
- %item_path%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <FONT FACE="Tahoma, sans-serif">full file or folder name</FONT><BR>
- %item_folder% &nbsp;&nbsp;- <FONT FACE="Tahoma, sans-serif">folder part only</FONT><BR>
- %item2_path%&nbsp;&nbsp;&nbsp;&nbsp;- <FONT FACE="Tahoma, sans-serif">Counterpart of %item_path% on the opposite grid</FONT><BR>
- %item2_folder%&nbsp;&nbsp;- <FONT FACE="Tahoma, sans-serif">Counterpart of %item_folder% on the opposite grid</FONT>
- </FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Examples:</B></FONT></P>
-<UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start
- visual difference tool:<BR><FONT FACE="Courier New, monospace">&quot;C:\Program
- Files\WinMerge\WinMergeU.exe&quot; &quot;%item_path%&quot;
- &quot;%item2_path%&quot;<BR>&nbsp;</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Show file in Windows Explorer:<BR><FONT FACE="Courier New, monospace">explorer
- /select, &quot;%item_path%&quot;<BR>&nbsp;</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open file in associated application:</FONT><BR><FONT FACE="Courier New, monospace">cmd
- /c start &quot;&quot; &quot;%item_path%&quot; </FONT><FONT FACE="Tahoma, sans-serif">or simply</FONT> <FONT FACE="Courier New, monospace">&quot;%item_path%&quot;</FONT><FONT FACE="Tahoma, sans-serif"><BR>&nbsp;</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open console dialog:<BR><FONT FACE="Courier New, monospace">cmd /k cd /D &quot;%item_folder%&quot;<BR>&nbsp;</FONT></FONT></P>
-</UL>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif"><B>Note</B><BR>You need to protect macros with quotation marks if they can resolve to a file path with space characters.</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/FreeFileSync.html b/BUILD/Help/html/FreeFileSync.html
deleted file mode 100644
index 2812f282..00000000
--- a/BUILD/Help/html/FreeFileSync.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1 (Win32)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130206;19035695">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="de-DE" DIR="LTR">
-<H3 CLASS="western" ALIGN=CENTER><IMG SRC="../img/FFS_logo.png" NAME="Grafik6" ALIGN=ABSMIDDLE WIDTH=258 HEIGHT=59 BORDER=0><FONT SIZE=4 STYLE="font-size: 16pt"><BR></FONT><FONT SIZE=3><I><SPAN STYLE="font-weight: normal">Folder
-Comparison and Synchronization</SPAN></I></FONT></H3>
-<H3 CLASS="western" ALIGN=LEFT>Usage:</H3>
-<OL>
- <LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Choose
- left and right directories.<BR></FONT><IMG SRC="../img/SourceTarget.png" NAME="Grafik4" ALIGN=TEXTTOP BORDER=0></P>
- <P STYLE="margin-bottom: 0cm">&nbsp;</P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Compare</B></SPAN></FONT><FONT FACE="Tahoma, sans-serif">
- them.<BR></FONT><IMG SRC="../img/CompareButton.png" NAME="Grafik1" ALIGN=BOTTOM BORDER=0></P>
- <P STYLE="margin-bottom: 0cm">&nbsp;</P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Select
- synchronization settings.<BR></FONT><IMG SRC="../img/SyncConfigButton.png" NAME="Grafik3" ALIGN=BOTTOM BORDER=0></P>
- <P STYLE="margin-bottom: 0cm">&nbsp;</P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Press
- </FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Synchronize</B></SPAN></FONT><FONT FACE="Tahoma, sans-serif">
- to begin synchronization.<BR></FONT><IMG SRC="../img/SynchronizeButton.png" NAME="Grafik2" ALIGN=BOTTOM BORDER=0></P>
-</OL>
-<P STYLE="margin-bottom: 0cm; border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.07cm; padding-left: 0cm; padding-right: 0cm">
-<BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<H3 CLASS="western" STYLE="page-break-before: always"><FONT FACE="Tahoma, sans-serif">Main
-Dialog Overview</FONT></H3>
-<OL>
- <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/MainDialog.png" NAME="Grafik5" ALIGN=BOTTOM BORDER=0></P>
-</OL>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<OL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Start
- comparison</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Change
- comparison settings</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Change
- synchronization settings</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Start
- synchronization</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Tree
- overview panel</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Add
- additional folder pairs</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select
- left and right folders</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Synchronization
- preview </FONT></FONT>
- </P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Save/load
- configuration</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Include/exclude
- specific files</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select
- categories to show on grid</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Synchronization
- statistics</FONT></FONT></P>
-</OL>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Links.html b/BUILD/Help/html/Links.html
deleted file mode 100644
index 38c46bf3..00000000
--- a/BUILD/Help/html/Links.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1 (Win32)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130206;20020705">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="de-DE" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">FreeFileSync
-Links</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif"><B>Homepage:</B></FONT><FONT FACE="Tahoma, sans-serif"><BR></FONT><A HREF="http://freefilesync.sourceforge.net/"><FONT COLOR="#000080"><FONT FACE="Tahoma, sans-serif"><SPAN LANG="zxx"><U>http://freefilesync.sourceforge.net</U></SPAN></FONT></FONT></A></P>
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif"><B>Project on SourceForge:</B></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">
- feedback, suggestions and
- bug-reports</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><B><BR></B></FONT><A HREF="http://sourceforge.net/projects/freefilesync"><FONT FACE="Tahoma, sans-serif">http://sourceforge.net/projects/freefilesync</FONT></A></P>
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif"><B>If you like FreeFileSync:</B> consider
- supporting the project by a donation<BR></FONT><A HREF="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=zenju@gmx.de&amp;no_shipping=1&amp;lc=US&amp;currency_code=EUR"><FONT FACE="Tahoma, sans-serif">Donate
- via PayPal</FONT></A></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Macros.html b/BUILD/Help/html/Macros.html
deleted file mode 100644
index d9d34a65..00000000
--- a/BUILD/Help/html/Macros.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.2.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130418;21351827">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2 { margin-bottom: 0.21cm }
- H2.western { font-family: "Times New Roman", serif }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="de-DE" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Macros</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">All
-directory names may contain macros that are expanded during
-synchronization. Begin and end of each macro is marked by a </FONT><FONT FACE="Tahoma, sans-serif"><B>%</B></FONT>
-<FONT FACE="Tahoma, sans-serif">character. Besides special macros
-handling time and date, the </FONT><SPAN STYLE="text-decoration: none"><FONT FACE="Tahoma, sans-serif"><B>operating
-system's environment variables</B></FONT></SPAN> <FONT FACE="Tahoma, sans-serif">can
-also be used.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Internal
-macros:</B></FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%date%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">2012-12-22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>format
- [YYYY-MM-DD] <BR><FONT FACE="Courier New, monospace">%time%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">123044&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>format
- [hhmmss] <BR><FONT FACE="Courier New, monospace">%timestamp%&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">2012-12-22
- 123044&nbsp;</FONT>format [YYYY-MM-DD hhmmss] <BR><BR><FONT FACE="Courier New, monospace">%year%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">2012</FONT><BR><FONT FACE="Courier New, monospace">%month%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">12</FONT><BR><FONT FACE="Courier New, monospace">%day%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">22</FONT><BR><BR><FONT FACE="Courier New, monospace">%hour%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">12</FONT><BR><FONT FACE="Courier New, monospace">%min%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">30</FONT><BR><FONT FACE="Courier New, monospace">%sec%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">44</FONT><BR><BR><FONT FACE="Courier New, monospace">%weekday%&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">Monday&nbsp;</FONT>day
- of the week <BR><FONT FACE="Courier New, monospace">%week%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- </FONT>e. g. <FONT FACE="Courier New, monospace">28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>calendar
- week</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Environment
-variables: </B><SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%AllUsersProfile%&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\ProgramData<BR>%AppData%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming<BR>%ComputerName%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">Zenju-PC<BR>%LocalAppData%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Local<BR>%ProgramData%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\ProgramData<BR>%ProgramFiles%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Program
- Files<BR>%ProgramFiles(x86)%&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Program
- Files (x86)<BR>%Public%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\Public<BR>%Temp%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Windows\Temp<BR>%UserName%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">Zenju<BR>%UserProfile%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;<BR>%WinDir%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Windows</FONT></FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Special
-folder locations </B><SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen6" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%csidl_Desktop%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Desktop<BR>%csidl_Downloads%&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Downloads<BR>%csidl_Favorites%&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Favorites<BR>%csidl_MyDocuments%&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Documents<BR>%csidl_MyMusic%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Music<BR>%csidl_MyPictures%&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Pictures<BR>%csidl_MyVideos%&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Videos<BR>%csidl_Nethood%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Network
- Shortcuts<BR>%csidl_Programs%&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g.
- <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Start
- Menu\Programs<BR>%csidl_Quicklaunch%&nbsp;</FONT>e. g.
- <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Internet
- Explorer\Quick Launch<BR>%csidl_Resources%&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Windows\Resources<BR>%csidl_StartMenu%&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Start
- Menu<BR>%csidl_Startup%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g.
- <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Start
- Menu\Programs\StartUp<BR>%csidl_Templates%&nbsp;&nbsp;&nbsp;</FONT>e.
- g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Templates</FONT></FONT></P>
-</SPAN><BR CLEAR=LEFT><FONT FACE="Tahoma, sans-serif">Note: Most
-macros listed here also have a variant for public folders.</FONT>
-E.g. <FONT FACE="Courier New, monospace">csidl_MyMusic</FONT> &rarr;
-<FONT FACE="Courier New, monospace">csidl_PublicMusic</FONT>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Hint:</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">You can add a great amount of flexibility to a ffs_batch configuration file
- by creating new temporary environment variables in a bat or cmd file that are evaluated by FreeFileSync at runtime.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
-The FreeFileSync batch file <FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT> contains macro <FONT FACE="Courier New, monospace">%MyVar%</FONT> instead of an absolute target folder and is invoked by a cmd file:</FONT>
-</P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace">set
- MyVar=C:\Target<BR>&quot;C:\Program files\FreeFileSync\FreeFileSync.exe&quot; C:\SyncJob.ffs_batch<BR>
- <FONT COLOR="#808080"><I><B>::%MyVar% is resolved as C:\Target during synchronization</B></I></FONT></FONT>
-</P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
- <P><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B><BR>
- Temporary environment variables created with the <FONT FACE="Courier New, monospace">set</FONT> command are only valid if the synchronization is started by calling the
- FreeFileSync executable directly. Using <FONT FACE="Courier New, monospace">start /wait</FONT> creates a new program context without these temporal variables.</FONT></P>
- </SPAN><BR CLEAR=LEFT>
- </P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/RealtimeSync.html b/BUILD/Help/html/RealtimeSync.html
deleted file mode 100644
index e9eae9cf..00000000
--- a/BUILD/Help/html/RealtimeSync.html
+++ /dev/null
@@ -1,147 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.4.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130722;18255897">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western" ALIGN=CENTER><IMG SRC="../img/RTS_logo.png" NAME="Grafik6" ALIGN=ABSMIDDLE WIDTH=269 HEIGHT=59 BORDER=0><FONT SIZE=4 STYLE="font-size: 16pt"><BR></FONT><FONT SIZE=3><I><SPAN STYLE="font-weight: normal">Automated Synchronization</SPAN></I></FONT></H3>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
-The primary purpose of RealtimeSync is to execute a command line each time a directory becomes
-available (e. g. insert of a USB-stick) <b>or</b> when it detects changes in one of the monitored directories. Usually this command line will trigger
-a FreeFileSync batch job.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT>
-<FONT FACE="Tahoma, sans-serif">Real time synchronization - in
-combination with FreeFileSync</FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start RealtimeSync.exe located in FreeFileSync's installation directory and
-enter all folders you want to monitor. Instead of doing this manually you can import a ffs_batch
-file via <B>Menu &rarr; Program &rarr; Open</B>. This not only extracts all directories relevant for synchronization
-but also sets up the command line to execute the ffs_batch file each time changes are detected.
-Now press <B>Start</B> to begin monitoring.</FONT></P>
-<UL>
- <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/RealtimeSync.png" NAME="Grafik3" ALIGN=MIDDLE BORDER=0></P>
-</UL>
-<BR>
-
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
- <B>Note</B></FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The
- command should </FONT><FONT FACE="Tahoma, sans-serif"><B>not</B></FONT>
- <FONT FACE="Tahoma, sans-serif"><B>block</B></FONT> <FONT FACE="Tahoma, sans-serif">progress. If you call a FreeFileSync batch job, make sure it does not show any popup
- windows. See notes in <A HREF="Command%20line.html">Command Line Usage</A>.</FONT><BR>&nbsp;</P>
-
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
- RealtimeSync will skip showing the main dialog and begin monitoring immediately if you pass a ffs_real configuration file <B>or</B> a FreeFileSync ffs_batch file
- as first command line argument to RealtimeSync.exe. This helps you integrate RealtimeSync into your operating system's auto start:<BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Courier New, monospace">&quot;C:\Program Files\FreeFileSync\RealtimeSync.exe&quot; &quot;D:\Backup Projects.ffs_real&quot;</FONT><BR>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Courier New, monospace">&quot;C:\Program Files\FreeFileSync\RealtimeSync.exe&quot; &quot;D:\Backup Projects.ffs_batch&quot;</FONT><BR>&nbsp;
- </FONT>
- </P>
-
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
- RealtimeSync is not tied to starting FreeFileSync. It can also be used in other scenarios, like sending an email whenever a certain directory is modified.</FONT></P>
-</SPAN><BR CLEAR=LEFT>
-</P>
-
-<BR>
-<BR>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT>
-<FONT FACE="Tahoma, sans-serif">Automatic synchronization when a USB
-stick is inserted</FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Save a
-ffs_batch configuration in the USB stick's root directory, e.g. <FONT FACE="Courier New, monospace">H:\</FONT>, to let RealtimeSync call it when the stick is mounted. Configure RealtimeSync as follows:</FONT></P>
-<UL>
- <P><IMG SRC="../img/WatchUsbInsert.png" NAME="Grafik2" ALIGN=BOTTOM BORDER=0>
- <BR></P>
-</UL>
-
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Whenever directory <FONT FACE="Courier New, monospace">H:\Data</FONT> becomes available, RealtimeSync executes the command line which starts the batch job located
-on the stick. RealtimeSync will also trigger each time files are modified in <FONT FACE="Courier New, monospace">H:\Data</FONT>.</FONT>
-</P>
-<BR>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">
- <B>Note</B><BR>
- The full path of the last changed file and the action that triggered the
- change notification (create, update or delete) are written
- to the environment variables <B>%change_path%</B> and <B>%change_action%</B>.
- </FONT>
- </P>
-</SPAN><BR CLEAR=LEFT>
-</P>
-<BR>
-<BR>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
-Log names of changed files and directories (Windows)</FONT></P>
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
-
- <FONT FACE="Tahoma, sans-serif">Show which file or directory has triggered a change. Enter command
- line:</FONT><BR>
-
- <FONT FACE="Courier New, monospace">
- &nbsp;&nbsp;&nbsp;&nbsp;cmd /c echo %change_action%
- &quot;%change_path%&quot; &amp; pause<BR><BR>
- </FONT>
-
- <FONT FACE="Tahoma, sans-serif">Write a list of all changes to a log file:</FONT><BR>
-
- <FONT FACE="Courier New, monospace">
- &nbsp;&nbsp;&nbsp;&nbsp;cmd /c echo %change_action% &quot;%change_path%&quot; &gt;&gt; C:\log.txt
- </FONT>
- </P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">
- <b>Note</b><br>
- When RealtimeSync executes a Windows batch file (bat or cmd) a black console window is shown. You can hide it using the Visual Basic script
- <FONT FACE="Courier New, monospace">HideConsole.vbs</FONT> located in FreeFileSync's installation directory:
- </FONT><br><br>
-
- <FONT FACE="Courier New, monospace">wscript &quot;C:\Program files\FreeFileSync\HideConsole.vbs&quot; C:\MyBatchFile.cmd</FONT>
- </P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm; text-decoration: none"><FONT FACE="Tahoma, sans-serif"><B>Limitations</B>:</FONT></P>
-<UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If
- multiple changes happen at the same time, only the name of the first
- file is written to variable <b>%changed_file%</b>.</FONT></P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">While
- RealtimeSync is executing the command line, monitoring is inactive
- and changes occurring during this time are lost. </FONT>
- </P>
-</UL>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Run as Service.html b/BUILD/Help/html/Run as Service.html
deleted file mode 100644
index 39ee6ba6..00000000
--- a/BUILD/Help/html/Run as Service.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.4.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130722;18264912">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Run as Service <SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
- RealtimeSync is designed to run as a background process which does not need further
- attention. Depending on your requirements there are a number of ways you can start it automatically.
- Generally the goal is to execute a command line like:</FONT><br>
- <br>
- <FONT FACE="Courier New, monospace">&lt;FreeFileSync installation folder&gt;\RealtimeSync.exe &lt;path to *.ffs_real or *.ffs_batch file&gt;</FONT>
-</P>
-
-<BR>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT></P>
-<UL>
- <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace">
- &quot;C:\Program Files\FreeFileSync\RealtimeSync.exe&quot; &quot;D:\Backup Projects.ffs_real&quot;</FONT></P>
- </SPAN><BR CLEAR=LEFT>
- </P>
-</UL>
-<BR><BR>
-<OL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
- RealtimeSync should be monitoring only while a specific user is logged in: Create
- a new shortcut, enter the command line from above as target and place it into the user's autostart folder.</FONT></P>
-
- <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/create_shortcut.png" NAME="Grafik3" ALIGN=BOTTOM BORDER=0></P>
- <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/shortcut_properties.png" NAME="Grafik4" ALIGN=BOTTOM BORDER=0></P>
- <P STYLE="margin-bottom: 0cm">&nbsp;</P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">RealtimeSync should be monitoring while Windows is running irrespective of
- currently logged in users: Create a new task in your operating systems's task scheduler and have it execute the command line above
- when the system starts. See <A HREF="Schedule%20a%20batch%20job.html">Schedule a Batch Job</A> for an example how to add a task. Then change
- the user which runs the task to <B>SYSTEM</B> - a special user account always running in the background.</FONT></P>
- <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/schedule_realtimesync.png" NAME="Grafik1" ALIGN=BOTTOM BORDER=0></P>
-</OL>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Schedule a Batch Job.html b/BUILD/Help/html/Schedule a Batch Job.html
deleted file mode 100644
index dbd3fc2a..00000000
--- a/BUILD/Help/html/Schedule a Batch Job.html
+++ /dev/null
@@ -1,120 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.4.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130722;18221462">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="de-DE" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Schedule a Batch Job</FONT></FONT></H2>
-<OL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create
- a new batch job via FreeFileSync's main dialog: </FONT><SPAN STYLE="font-variant: normal"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Menu
- &rarr; Program &rarr; Save as batch job...</B></SPAN></FONT></SPAN><FONT FACE="Tahoma, sans-serif"><BR>&nbsp;</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If
- the batch job shall run without user interaction or as part of an
- unattended batch script, make sure that no popup dialog stops the
- progress:<BR>Disable checkbox <SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><B>Show
- progress dialog</B></SPAN></SPAN> to avoid blocking while showing
- the result after synchronization. Alternatively you can leave this option checked and select the <i>On completion</i> action <B>Close progress dialog</B>
- located in synchronization settings. FreeFileSync will then show a progress dialog but close it automatically when it is finished.<BR>
- <br>
- <B>Note:</B> Even if the
- progress dialog is not shown at the beginning, you can make it
- visible <B>during</B> synchronization by double-clicking the
- FreeFileSync notification area icon.<BR>
- <BR>
- <IMG SRC="../img/SetupBatch.png" NAME="Grafik3" ALIGN=BOTTOM BORDER=0>
- <br><br>
- </FONT>
- </P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
- order to prevent error or warning popup messages from stopping
- progress, set <SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><B>Handle errors</B></SPAN></SPAN> to either <SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><B>Ignore</B></SPAN></SPAN>
- or <SPAN STYLE="font-variant: normal"><SPAN STYLE="font-style: normal"><B>Stop</B></SPAN></SPAN>.</FONT>
- <br><br>
- </P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Setup
- your operating system's scheduler</FONT></P>
-</OL>
-<OL>
- <OL TYPE=A>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Windows
- 7 Task Scheduler:</B></FONT></P>
- <UL>
- <LI>
- <P STYLE="margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Go to Start and run <FONT FACE="Courier New, monospace"><B>taskschd.msc</B></FONT>.</FONT>
- </P>
-
- <LI>
- <P STYLE="margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Create a new basic task and follow the wizard.</FONT>
- </P>
-
- <LI>
- <P STYLE="margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Make <B>Program/script</B> point to the location of FreeFileSync.exe
- and insert the ffs_batch file into <B>Add arguments</B>.</FONT>
- </P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Use quotation marks to protect spaces in path names, e.g. <FONT FACE="Courier New, monospace">&quot;D:\Backup Projects.ffs_batch&quot;</FONT><BR>
- <BR>
- <IMG SRC="../img/win7scheduler.png" NAME="Grafik1" ALIGN=BOTTOM BORDER=0></FONT>
- </P>
- </UL>
- </OL>
- <P STYLE="margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT><FONT FACE="Tahoma, sans-serif"><BR>Beginning
- with Windows Vista the <i>Program/script</i> always needs point to an executable file like FreeFileSync.exe even
- if ffs_batch file association is set. If a ffs_batch file is entered instead the task will return with
- error code 0xC1, &quot;%1 is not a valid Win32 application&quot;.</FONT></P>
- </SPAN><BR CLEAR=LEFT>&nbsp;
- </P>
-</OL>
-<OL>
- <OL TYPE=A START=2>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Windows XP Scheduled Tasks:</B></FONT></P>
- <UL>
- <LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Go
- to <B>Start &rarr; Control Panel &rarr; Scheduled Tasks</B> and select <B>Add Scheduled Task</B>.</FONT>
- </P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Follow the wizard and select FreeFileSync.exe as program to run.</FONT></P>
-
- <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif">Fill the input field <B>Run:</B>
- <FONT FACE="Courier New, monospace">&lt;FreeFileSync installation folder&gt;\FreeFileSync.exe &lt;job name&gt;.ffs_batch</FONT><BR>
- <BR>
- <IMG SRC="../img/ScheduleBatch.png" NAME="Grafik2" ALIGN=BOTTOM BORDER=0><BR>&nbsp;</FONT></P>
- </UL>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Ubuntu Linux Gnome-schedule:</B></FONT></P>
- <UL>
- <LI><P STYLE="margin-bottom: 0cm; font-weight: normal">
- <FONT FACE="Tahoma, sans-serif">Install Gnome-schedule, if necessary: </FONT><FONT FACE="Courier New, monospace">sudo apt-get install gnome-schedule</FONT></P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Go to <B>System &rarr; Preferences &rarr; Scheduled tasks</B></FONT></P>
-
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Enter the command:</FONT>
- <FONT FACE="Courier New, monospace">&lt;FreeFileSync installation folder&gt;/FreeFileSync &lt;job name&gt;.ffs_batch</FONT><BR>
- <BR>
- <IMG SRC="../img/ubuntuScheduler.png" NAME="Grafik5" ALIGN=BOTTOM BORDER=0></P>
- </UL>
- </OL>
-</OL>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Synchronize with FTP.html b/BUILD/Help/html/Synchronize with FTP.html
deleted file mode 100644
index cbca698d..00000000
--- a/BUILD/Help/html/Synchronize with FTP.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1 (Win32)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130206;19102356">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Synchronize
-with FTP/WebDAV <SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
-does not support accessing FTP volumes directly. But this
-functionality can be integrated by mapping the FTP web space to a
-drive letter:</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT>
-<FONT FACE="Tahoma, sans-serif">Use the free utility NetDrive
-(<A HREF="http://www.netdrive.net/">http://www.netdrive.net</A>)</FONT></P>
-<UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Add
- a <SPAN STYLE="font-style: normal"><B>New Site</B></SPAN> and
- specify site name, site URL, drive letter, account and password.</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Use
- the newly created drive as if it were a normal hard disk.</FONT></P>
-</UL>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif"><B>Note</B><BR>Most FTP drives set a
- file's time stamp to the current time when synchronizing ignoring
- the source file's time and date. As a workaround you can do a
- <A HREF="Compare%20by%20File%20Size.html">Compare by File Size</A>.</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<br>
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Synchronize with
-SFTP <SPAN STYLE="font-weight: normal">(Linux)</SPAN></FONT></H3>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">An SFTP
-share can be easily mapped onto a local folder for use with
-FreeFileSync:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; border: none; padding: 0cm; background: #e6e6e6">
- <LI><P STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Install:</FONT>
- <FONT FACE="Courier New, monospace"><BR>sudo apt-get install sshfs<BR>
- &nbsp;</FONT></P>
-
- <LI><P STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Mount SFTP share:</FONT>
- <FONT FACE="Courier New, monospace"><BR>sshfs ssh-account@ssh-server:&lt;path&gt; mountpoint<BR>
- &nbsp;</FONT></P>
-
- <LI><P STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Unmount:</FONT>
- <FONT FACE="Courier New, monospace"><BR>fusermount -u mountpoint</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Variable Drive Letters.html b/BUILD/Help/html/Variable Drive Letters.html
deleted file mode 100644
index a9368041..00000000
--- a/BUILD/Help/html/Variable Drive Letters.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.4.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130722;18235553">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="de-DE" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Variable Drive Letters</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">USB
-memory sticks or external hard disks often get different
-drive letters assigned when plugged into distinct computers. FreeFileSync
-offers two solutions to handle this problem:</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Option
-1: </B>Specify a folder path by using the volume name:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Use <FONT FACE="Courier New, monospace">[ZENJU-USB]\folder</FONT> instead of <FONT FACE="Courier New, monospace">G:\folder</FONT> where ZENJU-USB
- is the volume name of the USB stick which is currently mounted in drive <FONT FACE="Courier New, monospace">G:\</FONT>.
- </FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">
- <B>Note<BR></B>It
- is not required to look up and enter the volume name manually. Just
- select the corresponding entry in the drop down menu.</FONT>
- <IMG SRC="../img/VolumeName.png" NAME="Grafik1" ALIGN=BOTTOM BORDER=0>
- </P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Option
-2: </B></FONT><FONT FACE="Tahoma, sans-serif">Use a relative directory name:</FONT></P>
-
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; border: none; padding: 0.05cm; background: #e6e6e6">
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Tahoma, sans-serif">Use <FONT FACE="Courier New, monospace">\folder</FONT> instead of <FONT FACE="Courier New, monospace">G:\folder</FONT></FONT>
- </P><BR>
-
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm; font-style: normal">
- <FONT FACE="Tahoma, sans-serif">Save and copy synchronization settings to the USB stick: </FONT><FONT FACE="Courier New, monospace">G:\Backup.ffs_gui</FONT>
- </P><BR>
-
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm; font-style: normal">
- <FONT FACE="Tahoma, sans-serif">Start FreeFileSync by double-clicking on <FONT FACE="Courier New, monospace">G:\Backup.ffs_gui</FONT><br>
- <br>
- The working directory is then automatically set to <FONT FACE="Courier New, monospace">G:\</FONT> by the operating system so that the
- relative path <FONT FACE="Courier New, monospace">\folder</FONT> will be resolved as <FONT FACE="Courier New, monospace">G:\folder</FONT> during synchronization.
- </FONT>
- </P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Versioning.html b/BUILD/Help/html/Versioning.html
deleted file mode 100644
index 9b81b731..00000000
--- a/BUILD/Help/html/Versioning.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="LibreOffice 4.0.2.2 (Windows)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130422;11473939">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">File Versioning</FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">When
-you need to preserve files that have been deleted or overwritten it's
-often sufficient to select <B>Recycle bin</B> in synchronization
-settings. However this is only available for local drives and offers
-little control on how to store and how long to keep the files.
-FreeFileSync therefore has an additional option, <B>Versioning</B>.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>1.
-Keep all versions of old files</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
-synchronization settings set deletion handling to <B>Versioning</B>
-and naming convention to <B>Time stamp</B>. FreeFileSync will move
-deleted files into the provided folder and add a time stamp to each
-file name. The structure of the synchronized folders is preserved so
-that old versions of a file can be conveniently accessed via a file
-browser.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
-A file <FONT FACE="Courier New, monospace">Folder\File.txt</FONT> was updated three times and old versions were moved to folder <FONT FACE="Courier New, monospace">C:\Revisions</FONT>
-</FONT>
-</P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">C:\Revisions\Folder\File.txt
- </FONT><FONT FACE="Courier New, monospace"><B>2012-12-12
- 111111</B></FONT><FONT FACE="Courier New, monospace">.txt<BR>C:\Revisions\Folder\File.txt
- </FONT><FONT FACE="Courier New, monospace"><B>2012-12-12
- 122222</B></FONT><FONT FACE="Courier New, monospace">.txt<BR>C:\Revisions\Folder\File.txt
- </FONT><FONT FACE="Courier New, monospace"><B>2012-12-12 133333</B></FONT><FONT FACE="Courier New, monospace">.txt</FONT></FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>2.
-Save only the most recent version</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Set
-deletion handling to <B>Versioning</B> and naming convention to
-<B>Replace</B>. Deleted files will be moved to the specified folder
-without any decoration and will replace already existing older
-versions.</FONT></P>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>3.
-Save versions at certain intervals</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">With
-naming convention </FONT><FONT FACE="Tahoma, sans-serif"><B>Replace</B></FONT>
-<FONT FACE="Tahoma, sans-serif">it is possible to refine the
-granularity of versions to keep by adding <A HREF="Macros.html">macros</A>
-to the versioning folder path. For example you can save deleted files
-on a per sync session basis by adding the </FONT><FONT FACE="Tahoma, sans-serif"><B>%timestamp%</B></FONT>
-<FONT FACE="Tahoma, sans-serif">macro:</FONT></P>
-
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
-Using the dynamically generated folder name <FONT FACE="Courier New, monospace">C:\Revisions\%timestamp%</FONT></FONT>
-</P>
-
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.04cm; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">C:\Revisions\</FONT><FONT FACE="Courier New, monospace"><B>2012-12-12
- 111111</B></FONT><FONT FACE="Courier New, monospace">\Folder\File.txt<BR>C:\Revisions\</FONT><FONT FACE="Courier New, monospace"><B>2012-12-12
- 122222</B></FONT><FONT FACE="Courier New, monospace">\Folder\File.txt<BR>C:\Revisions\</FONT><FONT FACE="Courier New, monospace"><B>2012-12-12
- 133333</B></FONT><FONT FACE="Courier New, monospace">\Folder\File.txt</FONT></FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">This
-allows for a simple manual undo by moving the deleted files from the
-last synchronization session back to their original folders. Other
-macros like </FONT><FONT FACE="Tahoma, sans-serif"><B>%date%</B></FONT>
-<FONT FACE="Tahoma, sans-serif">or </FONT><FONT FACE="Tahoma, sans-serif"><B>%weekday%</B></FONT>
-<FONT FACE="Tahoma, sans-serif">can be used to reduce the granularity
-to days and weeks.</FONT></P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Volume Shadow Copy.html b/BUILD/Help/html/Volume Shadow Copy.html
deleted file mode 100644
index c5e32e80..00000000
--- a/BUILD/Help/html/Volume Shadow Copy.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1 (Win32)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20130207;1532278">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H2.cjk { font-family: "SimSun" }
- H2.ctl { font-family: "Mangal" }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Volume
-Shadow Copy Service <SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></FONT></H2>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
-supports copying locked or shared files by creating a Volume Shadow
-Copy of the source drive. This feature can be configured via </FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Menu
-&rarr; Tools &rarr; Global settings: Copy locked files</B></SPAN></FONT><FONT FACE="Tahoma, sans-serif">.</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The
- volume snapshot created by the Volume Shadow Copy Service is used
- when copying locked files only.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm; font-style: normal">
- <FONT FACE="Tahoma, sans-serif">Accessing the Volume Shadow Copy
- Service requires FreeFileSync to be started with administrator
- rights.</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Troubleshooting</B></FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If you
-experience problems using the Volume Shadow Copy Service a renewal of
-registration might help. Create and execute a cmd batch file and insert the following lines or enter directly via command line:</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; border: none; padding: 0cm; background: #e6e6e6">
- <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-bottom: 0cm">
- <FONT FACE="Courier New, monospace">
- cd /d %windir%\system32<BR>
- Net stop vss<BR>
- Net stop swprv<BR>
- regsvr32 ole32.dll<BR>
- regsvr32 oleaut32.dll<BR>
- regsvr32 vss_ps.dll<BR>
- Vssvc /register<BR>
- regsvr32 /i swprv.dll<BR>
- regsvr32 /i eventcls.dll<BR>
- regsvr32 es.dll<BR>
- regsvr32 stdprov.dll<BR>
- regsvr32 vssui.dll<BR>
- regsvr32 msxml.dll<BR>
- regsvr32 msxml3.dll<BR>
- regsvr32 msxml4.dll</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P ALIGN=LEFT STYLE=" margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Reference:
-<A HREF="http://support.microsoft.com/kb/940032">http://support.microsoft.com/kb/940032</A></FONT></P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/HideConsole.vbs b/BUILD/HideConsole.vbs
deleted file mode 100644
index 6a178410..00000000
--- a/BUILD/HideConsole.vbs
+++ /dev/null
@@ -1,17 +0,0 @@
-set argIn = WScript.Arguments
-num = argIn.Count
-
-if num = 0 then
- WScript.Echo "Call a Windows batch file (*.cmd, *.bat) without showing the console window" & VbCrLf & VbCrLf &_
- "Command line:" & VbCrLf & "WScript HideConsole.vbs MyBatchfile.cmd <command line arguments>"
- WScript.Quit 1
-end if
-
-argOut = ""
-for i = 0 to num - 1
- argOut = argOut & """" & argIn.Item(i) & """ "
-next
-
-set WshShell = WScript.CreateObject("WScript.Shell")
-
-WshShell.Run argOut, 0, True \ No newline at end of file
diff --git a/BUILD/Changelog.txt b/FreeFileSync/Build/Changelog.txt
index 8f8006d6..4e96b14b 100644
--- a/BUILD/Changelog.txt
+++ b/FreeFileSync/Build/Changelog.txt
@@ -1,3 +1,24 @@
+FreeFileSync 5.23
+-----------------
+Allow sorting root nodes on overview panel
+Support retry on failure to resolve path by volume name
+Copy high-precision modification times for files and symlinks
+Align top panel height with comparison and sync buttons
+Show lock owner while waiting on a locked directory
+Resolved help file W3C validation issues
+Fixed high contrast accessibility issues in help
+Fixed crash for CPUs without SSE2 when using VSS (Windows XP)
+Prevent progress statistics timer overflow
+Save RealtimeSync settings before forced exit due to shutdown or log off
+Resolved contract violation error due to out of memory
+RealtimeSync does not block system shutdown anymore
+Added "select all" context menu option for progess log
+Handle progress log keyboard input ignoring input focus
+Fixed category icon background color issues
+Report error when reading active config file failed during save
+Preload adjacent file icons on grid
+
+
FreeFileSync 5.22 [2013-10-01]
------------------------------
New options for automatic retry after error
diff --git a/BUILD/Help/FreeFileSync.hhc b/FreeFileSync/Build/Help/FreeFileSync.hhc
index 1902cb14..1902cb14 100644
--- a/BUILD/Help/FreeFileSync.hhc
+++ b/FreeFileSync/Build/Help/FreeFileSync.hhc
diff --git a/BUILD/Help/FreeFileSync.hhp b/FreeFileSync/Build/Help/FreeFileSync.hhp
index a9f19ebc..a9f19ebc 100644
--- a/BUILD/Help/FreeFileSync.hhp
+++ b/FreeFileSync/Build/Help/FreeFileSync.hhp
diff --git a/FreeFileSync/Build/Help/html/Command Line.html b/FreeFileSync/Build/Help/html/Command Line.html
new file mode 100644
index 00000000..bea7c61a
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Command Line.html
@@ -0,0 +1,140 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Command Line Usage</H2>
+
+<P>FreeFileSync enables additional synchronization scenarios via a command line interface.
+To get a syntax overview, open the console, go to the directory where FreeFileSync is installed and type:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">FreeFileSync -h</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<h3>1. Run a FreeFileSync batch job</h3>
+
+<P>In order to start synchronization in batch mode, supply the path of a ffs_batch configuration file as the first argument for FreeFileSync.exe:</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">FreeFileSync &quot;D:\Backup Projects.ffs_batch&quot;</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<P>After synchronization one of the following status codes is returned:</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <B>Return Codes</B><BR>
+ 0 - Synchronization completed successfully<BR>
+ 1 - Synchronization completed with warnings<BR>
+ 2 - Synchronization completed with errors<BR>
+ 3 - Synchronization was aborted
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<P>
+You can evaluate these codes from a script (e.g. a cmd or bat file on Windows)
+and check if synchronization completed successfully:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">
+ &quot;C:\Program Files\FreeFileSync\FreeFileSync.exe&quot; &quot;D:\Backup Projects.ffs_batch&quot;<BR>
+ if errorlevel 1 (<BR>
+ &nbsp;&nbsp;<FONT COLOR="#808080"><I><B>::if return code is 1 or greater, something went wrong, add special treatment here</B></I></FONT><BR>
+ &nbsp;&nbsp;echo Errors occurred during synchronization...<BR>
+ &nbsp;&nbsp;pause<BR>
+ )</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<br>
+
+<P>Instead of displaying &quot;An error occurred!&quot; you can also send an email notification (using a third party tool).</P>
+
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Attention</B><BR>
+ Make sure your script is not blocked by a popup dialog. Consider the
+ following options when setting up a FreeFileSync batch job:
+ <br>&nbsp;
+
+ <ul STYLE="margin: 0">
+ <LI>Disable checkbox <B>Show progress dialog</B> or have <B>On completion</B> automatically close the results dialog after synchronization.
+
+ <LI>Set error handling to <B>Stop</B> or <B>Ignore</B>.
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<h3>2. Start a FreeFileSync GUI configuration</h3>
+
+<P>If you pass a ffs_gui file, FreeFileSync will start in GUI mode and immediately start comparison (but only if all directories exist):</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">FreeFileSync &quot;D:\Manual Backup.ffs_gui&quot;</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<h3>3. Customize an existing configuration</h3>
+
+<P>You can replace the directories of a given ffs_gui or ffs_batch configuration file by using the <FONT FACE="Courier New, monospace">-leftdir</FONT>
+and <FONT FACE="Courier New, monospace">-rightdir</FONT> parameters:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">FreeFileSync &quot;D:\Manual Backup.ffs_gui&quot; -leftdir C:\NewSource -rightdir D:\NewTarget</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<h3>4. Merge multiple configurations</h3>
+
+<P>When more than one configuration file is provided, FreeFileSync will merge
+everything into a single configuration with multiple folder pairs and start in GUI mode:</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">FreeFileSync &quot;D:\Manual Backup.ffs_gui&quot; &quot;D:\Backup Projects.ffs_batch&quot;</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Comparison Settings.html b/FreeFileSync/Build/Help/html/Comparison Settings.html
new file mode 100644
index 00000000..08d3b44b
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Comparison Settings.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Comparison Settings</H2>
+
+<P><IMG SRC="../img/CmpSettings.png">
+<br>&nbsp;
+</P>
+
+<H3>Symbolic Link Handling</H3>
+
+<P>FreeFileSync offers three options to configure handling of symbolic links (also called symlinks or soft links):</P>
+
+<OL>
+ <LI><B>Exclude:</B>
+ Skip symbolic links while scanning directories.<BR>&nbsp;
+
+ <LI><B>Direct:</B>
+ Evaluate the symbolic link object
+ directly. Symbolic links will be shown as a separate entity on grid.
+ Links pointing to directories are not traversed and the link object
+ is copied directly during synchronization.<BR>&nbsp;
+
+ <LI><B>Follow:</B>
+ Treat symbolic links like the object they are pointing to. Links
+ pointing to directories are traversed like ordinary directories and
+ the target of each link is copied during synchronization.
+</OL>
+
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B>
+ <ul STYLE="margin: 0">
+ <LI>Under Windows the symbolic link options apply to symbolic links, volume mount points and NTFS junction points.
+ <LI>Copying symbolic links requires FreeFileSync to be started with administrator rights.
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+
+<H3>I. Compare by File time and size</H3>
+
+<P>This variant considers two files with the same name as equal when both modification
+time <B>and</B> file size match. The following categories are distinguished:</P>
+
+<OL TYPE=i>
+ <LI><B>file exists on one side only</B>
+ <OL TYPE="square">
+ <LI>left only
+ <LI>right only
+ </OL>
+
+ <LI><B>file exists on both sides</B>
+ <OL TYPE=i>
+ <LI><B>different date</B>
+ <UL>
+ <LI>left newer
+ <LI>right newer
+ </UL>
+ <LI><B>same date</B>
+ <UL>
+ <LI>equal
+ <LI>conflict (same date, different size)
+ </UL>
+ </OL>
+</OL>
+
+<BR>
+
+<H3>II. Compare by File content</H3>
+
+<P>Two files with the same name are marked as equal if and only if they have
+the same content. This option is more useful for consistency checks
+rather than backup operations since it is naturally slower. The file
+modification time is not taken into account at all.
+</P>
+
+<OL TYPE=i>
+ <LI VALUE=1><B>file exists on one side only</B>
+ <OL TYPE="square">
+ <LI>left only
+ <LI>right only
+ </OL>
+ <LI><B>file exists on both sides</B>
+ <OL TYPE="square">
+ <LI>equal
+ <LI>different content
+ </OL>
+</OL>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Daylight Saving Time.html b/FreeFileSync/Build/Help/html/Daylight Saving Time.html
new file mode 100644
index 00000000..8d51498e
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Daylight Saving Time.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Daylight Saving Time<SPAN STYLE="font-weight: normal"> (Windows)</SPAN></H2>
+
+<P>A common problem synchronization software has to handle are +-1 hour
+file time shifts after a Daylight Saving Time (DST) switch has
+occurred. This can be observed for example when a FAT-formatted
+volume is compared against an NTFS volume as is the case when synchronizing a local disk against a
+USB memory stick. Files that previously appeared to be in sync are
+now shown with an one hour modification time offset, although they
+have not been modified by the user or the operating system.</P>
+
+<P>The reason for this behavior lies in the way NTFS and FAT drives
+store file times: NTFS stores time in UTC format, while FAT uses
+local time.</P>
+
+<P>When times of these two different formats are compared, one format
+has to be converted into the other first. In either way Windows uses
+the current DST status as well as the current time zone for
+its calculations. Consequently the result of this comparison is
+dependent from current system settings and in particular file times
+that used to be the same can show up as different after a DST switch or when the time zone is changed.</P>
+
+<P>For a detailed discussion about this issue refer to:
+<A HREF="http://www.codeproject.com/KB/datetime/dstbugs.aspx">http://www.codeproject.com/KB/datetime/dstbugs.aspx</A>
+</P>
+
+<BR>
+
+<h3>Solution:</h3>
+
+<P>FreeFileSync automatically handles this problem by adding the missing time information. Each file on a
+FAT volume automatically gets additional meta data encoded in its
+creation date that enables a correct file time calculation. This not
+only solves all DST issues but also time shifts that occur due to
+travel between different time zones.</P>
+
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B>
+ <ul STYLE="margin: 0">
+ <LI>In order for FreeFileSync to start handling DST and timezone differences, an initial full synchronization
+ is required. Subsequent syncs will then never show a time difference again for unchanged files.
+
+ <LI>If a FAT volume is scanned the first time by FreeFileSync this will take longer than usual
+ since additional meta data is written for each file.
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Exclude Items.html b/FreeFileSync/Build/Help/html/Exclude Items.html
new file mode 100644
index 00000000..65142cc7
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Exclude Items.html
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Exclude Items</H2>
+
+<P>Files and directories are only considered for synchronization if they pass
+all filter rules. They have to match <B>at least one</B> entry in the
+include list and <B>none</B> of the entries in the exclude list:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <ul STYLE="margin: 0">
+ <li>Each list item must be a file or directory path <B>relative</B> to synchronization base directories.
+
+ <li>Multiple items must be separated by <B>;</B> or a new line.
+
+ <li>Wild cards <B>*</B> and <B>?</B> may be used: <B>*</B> means zero or more characters while <B>?</B> represents exactly one character.
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<P><B>Example:</B> Exclude items for mirror-sync from <FONT FACE="Courier New, monospace">C:\Source</FONT> to <FONT FACE="Courier New, monospace">D:\Target</FONT>
+</P>
+
+<div STYLE="margin-left: 1.3cm">
+<div STYLE="float: left; width: 80%; color:black; background: #e6e6e6">
+ <TABLE WIDTH="100%" CELLPADDING=0 CELLSPACING=0 STYLE="padding-top: 0.1cm; color=black">
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 2px solid black">
+ <P STYLE="margin-left: 0.8cm"><B>Description</B></P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 2px solid black; border-left: 1.00pt solid black">
+ <P STYLE="margin-left: 0.8cm"><B>Exclude</B></P>
+ </TD>
+ </TR>
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 1px solid black">
+ <P STYLE="margin-left: 0.8cm">Single file <FONT FACE="Courier New, monospace">C:\Source\file.txt</FONT></P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 1px solid black; border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">\file.txt</FONT></P>
+ </TD>
+ </TR>
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 1px solid black">
+ <P STYLE="margin-left: 0.8cm">Single folder <FONT FACE="Courier New, monospace">C:\Source\SubFolder</FONT></P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 1px solid black; border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">\SubFolder\</FONT></P>
+ </TD>
+ </TR>
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 1px solid black">
+ <P STYLE="margin-left: 0.8cm">All files (and folders) named <FONT FACE="Courier New, monospace">thumbs.db</FONT>
+ </P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 1px solid black; border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">*\thumbs.db</FONT></P>
+ </TD>
+ </TR>
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 1px solid black">
+ <P STYLE="margin-left: 0.8cm">All <FONT FACE="Courier New, monospace">*.tmp</FONT> files located in <FONT FACE="Courier New, monospace">SubFolder</FONT> only</P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 1px solid black; border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">\SubFolder\*.tmp</FONT></P>
+ </TD>
+ </TR>
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 1px solid black">
+ <P STYLE="margin-left: 0.8cm">Files and folders containing <FONT FACE="Courier New, monospace">temp</FONT> somewhere in their path</P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 1px solid black; border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">*temp*</FONT></P>
+ </TD>
+ </TR>
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 1px solid black">
+ <P STYLE="margin-left: 0.8cm">Multiple entries separated by semicolon</P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 1px solid black; border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">*.tmp; *.doc; *.bak</FONT></P>
+ </TD>
+ </TR>
+
+ <TR>
+ <TD WIDTH="65%" STYLE="border-bottom: 1px solid black">
+ <P STYLE="margin-left: 0.8cm">Exclude all files and folders located in subdirectories of base directories</P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-bottom: 1px solid black; border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">\*\*</FONT></P>
+ </TD>
+ </TR>
+ <TR>
+ <TD WIDTH="65%">
+ <P STYLE="margin-left: 0.8cm">Exclude only <FONT FACE="Courier New, monospace">*.txt</FONT> files located in subdirectories of base directories</P>
+ </TD>
+ <TD WIDTH="35%" STYLE="border-left: 1px solid black">
+ <P STYLE="margin-left: 0.8cm"><FONT FACE="Courier New, monospace">\*\*.txt</FONT></P>
+ </TD>
+ </TR>
+ </TABLE>
+</div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B>
+ <ul STYLE="margin: 0">
+ <LI>For simple exclusions just right-click and exclude one item or a list
+ of items directly on main grid via context menu.
+
+ <LI>A filter phrase is compared against
+ both file and directory paths. If you want to consider directories
+ only, you can give a hint by appending a path separator (<B>\</B>).
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Expert Settings.html b/FreeFileSync/Build/Help/html/Expert Settings.html
new file mode 100644
index 00000000..17c73533
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Expert Settings.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Expert Settings</H2>
+
+<P>FreeFileSync has a number of special purpose settings that can only be accessed
+directly via the global configuration file <FONT FACE="Courier New, monospace">GlobalSettings.xml</FONT>.
+To locate this file enter <FONT FACE="Courier New, monospace">%appdata%\FreeFileSync</FONT> in the Windows Explorer address bar or go to the FreeFileSync
+installation folder if you are using the portable installation.
+Note that this file is read once when FreeFileSync starts and saved when it closes. Therefore do only apply changes while FreeFileSync is not running.
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">
+ &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<BR>
+ &lt;FreeFileSync XmlType=&quot;GLOBAL&quot;&gt;<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&lt;Shared&gt;<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>FileTimeTolerance</B> Seconds=&quot;2&quot;/&gt;<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>RunWithBackgroundPriority</B> Enabled=&quot;false&quot;/&gt;<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>LockDirectoriesDuringSync</B> Enabled=&quot;true&quot;/&gt;<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>VerifyCopiedFiles</B> Enabled=&quot;false&quot;/&gt;<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<B>LastSyncsLogSizeMax</B> Bytes=&quot;100000&quot;/&gt;
+ </FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<P><B>FileTimeTolerance:</B><BR>
+
+By default file modification times
+are allowed to have a 2 second difference while still being
+considered equal. This is required by FAT/FAT32 file systems which
+store file times with a 2 second precision only.<BR>This setting
+can also be used to simulate a &quot;compare by file size&quot;,
+ignoring last modification times: If tolerance is set to some high
+value, e.g. 2000000000, then changed files will be detected as a
+conflict (same date, different file size) and the
+synchronization direction for conflicts can be set accordingly.
+</P>
+
+<P><B>RunWithBackgroundPriority:</B><BR>
+
+While synchronization is running, other applications which are accessing the same
+data locations may experience a noticeable slowdown. Enable this
+setting to lower FreeFileSync's resource consumption at the cost of a
+significantly slower synchronization speed.
+</P>
+
+<P><B>LockDirectoriesDuringSync:</B><BR>
+
+In order to avoid race conditions of multiple FreeFileSync instances
+writing to the same folder at the same time, accesses are serialized
+by lock files (<FONT FACE="Courier New, monospace">sync.ffs_lock</FONT>).
+This allows to operate FreeFileSync with an arbitrary number of users
+in a network out of the box.
+</P>
+
+<P><B>VerifyCopiedFiles:</B><BR>
+
+If active, FreeFileSync will binary-compare source and target files after
+copying and report verification errors. Note that this may double
+file copy times and is no guarantee that data has not already been
+corrupted prior to copying and corruption is not hidden by
+deceptively reading valid data from various buffers in the
+application and hardware stack.<BR>
+<A HREF="http://blogs.msdn.com/b/oldnewthing/archive/2012/09/19/10350645.aspx">Does
+the CopyFile function verify that the data reached its final destination successfully?</A>
+</P>
+
+<P><B>LastSyncsLogSizeMax:</B><BR>
+
+The progress logs of the most recent synchronizations (for both GUI and batch jobs) are collected automatically in the file <FONT FACE="Courier New, monospace">LastSyncs.log</FONT>.
+The maximum size of this log file can be set here.
+</P>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/External Applications.html b/FreeFileSync/Build/Help/html/External Applications.html
new file mode 100644
index 00000000..8d88ce1f
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/External Applications.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>External Applications</H2>
+
+<P>When you double-click on one of the rows on the main dialog, FreeFileSync opens the operating system's file browser
+by default. On Windows it calls <FONT FACE="Courier New, monospace">explorer /select, &quot;%item_path%&quot;</FONT>, on
+Linux <FONT FACE="Courier New, monospace">xdg-open &quot;%item_folder%&quot;</FONT> and on OS X <FONT FACE="Courier New, monospace">open -R &quot;%item_path%&quot;</FONT>.
+</P>
+
+<P>You can customize this behavior and integrate other external applications into FreeFileSync:
+Navigate to <B>Menu &rarr; Tools &rarr; Global settings: Customize context menu</B>
+and add or replace a command. The first entry is executed when double-clicking a row on main grid or pressing ENTER while all other entries can be accessed via the
+context menu shown after a right mouse click. The following macros can be used:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">%item_path%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>- full file or folder name<BR>
+ <FONT FACE="Courier New, monospace">%item_folder% &nbsp;&nbsp;</FONT>- folder part only<BR>
+ <FONT FACE="Courier New, monospace">%item2_path%&nbsp;&nbsp;&nbsp;&nbsp;</FONT>- Counterpart of %item_path% on the opposite grid<BR>
+ <FONT FACE="Courier New, monospace">%item2_folder%&nbsp;&nbsp;</FONT>- Counterpart of %item_folder% on the opposite grid
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<h3>Examples:</h3>
+
+<UL>
+ <LI>Start visual difference tool:<BR>
+ <FONT FACE="Courier New, monospace">&quot;C:\Program Files (x86)\WinMerge\WinMergeU.exe&quot; &quot;%item_path%&quot; &quot;%item2_path%&quot;<BR>&nbsp;</FONT>
+
+ <LI>Show file in Windows Explorer:<BR>
+ <FONT FACE="Courier New, monospace">explorer /select, &quot;%item_path%&quot;<BR>&nbsp;</FONT>
+
+ <LI>Open file in associated application:<BR>
+ <FONT FACE="Courier New, monospace">cmd /c start &quot;&quot; &quot;%item_path%&quot; </FONT>or simply <FONT FACE="Courier New, monospace">&quot;%item_path%&quot;</FONT><BR>&nbsp;
+
+ <LI>Open console dialog:<BR>
+ <FONT FACE="Courier New, monospace">cmd /k cd /D &quot;%item_folder%&quot;</FONT>
+</UL>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B><BR>
+ You need to protect macros with quotation marks if they can resolve to a file path with space characters.
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/FreeFileSync.html b/FreeFileSync/Build/Help/html/FreeFileSync.html
new file mode 100644
index 00000000..964cb7e3
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/FreeFileSync.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="de-DE" DIR="LTR">
+
+<H2 ALIGN=CENTER>
+<IMG SRC="../img/FFS_logo.png"><BR>
+<FONT SIZE=3><SPAN STYLE="font-weight: normal"><I>Folder Comparison and Synchronization</I></SPAN></FONT>
+</H2>
+
+<H3>Usage:</H3>
+
+<OL>
+ <LI>Choose left and right directories.<BR>
+ <IMG SRC="../img/SourceTarget.png">
+ <BR>&nbsp;
+
+ <LI><B>Compare</B> them.<BR>
+ <IMG SRC="../img/CompareButton.png">
+ <BR>&nbsp;
+
+ <LI>Select synchronization settings.<BR>
+ <IMG SRC="../img/SyncConfigButton.png">
+ <BR>&nbsp;
+
+ <LI>Press <B>Synchronize</B> to begin synchronization.<BR>
+ <IMG SRC="../img/SynchronizeButton.png">
+</OL>
+
+<BR>
+
+<H3>Main Dialog Overview</H3>
+
+<IMG SRC="../img/MainDialog.png">
+
+<BR>
+
+<OL>
+ <LI><FONT SIZE=4>Start comparison</FONT>
+ <LI><FONT SIZE=4>Change comparison settings</FONT>
+ <LI><FONT SIZE=4>Change synchronization settings</FONT>
+ <LI><FONT SIZE=4>Start synchronization</FONT>
+ <LI><FONT SIZE=4>Tree overview panel</FONT>
+ <LI><FONT SIZE=4>Add additional folder pairs</FONT>
+ <LI><FONT SIZE=4>Select left and right folders</FONT>
+ <LI><FONT SIZE=4>Synchronization preview </FONT>
+ <LI><FONT SIZE=4>Save/load configuration</FONT>
+ <LI><FONT SIZE=4>Include/exclude specific files</FONT>
+ <LI><FONT SIZE=4>Select categories to show on grid</FONT>
+ <LI><FONT SIZE=4>Synchronization statistics</FONT>
+</OL>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Links.html b/FreeFileSync/Build/Help/html/Links.html
new file mode 100644
index 00000000..5f7ca317
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Links.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="de-DE" DIR="LTR">
+
+<H2>FreeFileSync Links</H2>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Homepage:</B><BR>
+ <A HREF="http://freefilesync.sf.net/">http://freefilesync.sf.net/</A>
+ <BR><BR>
+
+ <B>Project on SourceForge:</B> feedback, suggestions and bug-reports<BR>
+ <A HREF="http://sourceforge.net/projects/freefilesync/">http://sourceforge.net/projects/freefilesync/</A>
+ <BR><BR>
+
+ <B>If you like FreeFileSync:</B><BR>
+ <A HREF="http://freefilesync.sourceforge.net/donate.php">Support the project by a donation</A>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Macros.html b/FreeFileSync/Build/Help/html/Macros.html
new file mode 100644
index 00000000..b9b803ab
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Macros.html
@@ -0,0 +1,147 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="de-DE" DIR="LTR">
+
+<H2>Macros</H2>
+
+<P>All directory names may contain macros that are expanded during
+synchronization. Begin and end of each macro is marked by a <B>%</B> character. Besides special macros
+handling time and date, the <B>operating system's environment variables</B> can also be used.
+</P>
+
+<BR>
+
+<h3>Internal macros</h3>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">%date%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">2012-12-22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>format: [YYYY-MM-DD] <BR>
+
+ <FONT FACE="Courier New, monospace">%time%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">123044&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>format: [hhmmss] <BR>
+
+ <FONT FACE="Courier New, monospace">%timestamp%&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">2012-12-22 123044&nbsp;</FONT>format: [YYYY-MM-DD hhmmss]<BR><BR>
+
+ <FONT FACE="Courier New, monospace">%year%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">2012</FONT><BR>
+
+ <FONT FACE="Courier New, monospace">%month%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">12</FONT><BR>
+
+ <FONT FACE="Courier New, monospace">%day%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">22</FONT><BR><BR>
+
+ <FONT FACE="Courier New, monospace">%hour%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">12</FONT><BR>
+
+ <FONT FACE="Courier New, monospace">%min%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">30</FONT><BR>
+
+ <FONT FACE="Courier New, monospace">%sec%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">44</FONT><BR><BR>
+
+ <FONT FACE="Courier New, monospace">%weekday%&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">Monday&nbsp;</FONT>(day of the week)<BR>
+
+ <FONT FACE="Courier New, monospace">%week%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </FONT>e. g. <FONT FACE="Courier New, monospace">28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>(calendar week)
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<h3>Environment variables<SPAN STYLE="font-weight: normal"> (Windows)</SPAN></h3>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">%AllUsersProfile%&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\ProgramData<BR>
+ %AppData%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming<BR>
+ %ComputerName%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">Zenju-PC<BR>
+ %LocalAppData%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Local<BR>
+ %ProgramData%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\ProgramData<BR>
+ %ProgramFiles%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Program Files<BR>
+ %ProgramFiles(x86)%&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Program Files (x86)<BR>
+ %Public%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\Public<BR>
+ %Temp%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Windows\Temp<BR>
+ %UserName%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">Zenju<BR>
+ %UserProfile%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;<BR>
+ %WinDir%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Windows</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<h3>Special folder locations<SPAN STYLE="font-weight: normal"> (Windows)</SPAN></h3>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">%csidl_Desktop%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Desktop<BR>
+ %csidl_Downloads%&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Downloads<BR>
+ %csidl_Favorites%&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Favorites<BR>
+ %csidl_MyDocuments%&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Documents<BR>
+ %csidl_MyMusic%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Music<BR>
+ %csidl_MyPictures%&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Pictures<BR>
+ %csidl_MyVideos%&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\Videos<BR>
+ %csidl_Nethood%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Network Shortcuts<BR>
+ %csidl_Programs%&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Start Menu\Programs<BR>
+ %csidl_Quicklaunch%&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch<BR>
+ %csidl_Resources%&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Windows\Resources<BR>
+ %csidl_StartMenu%&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Start Menu<BR>
+ %csidl_Startup%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\StartUp<BR>
+ %csidl_Templates%&nbsp;&nbsp;&nbsp;</FONT>e. g. <FONT FACE="Courier New, monospace">C:\Users\&lt;username&gt;\AppData\Roaming\Microsoft\Windows\Templates</FONT>
+
+ <p>
+ Note: Most macros listed here also have a variant for public folders.
+ E.g. <FONT FACE="Courier New, monospace">csidl_MyMusic</FONT> &rarr; <FONT FACE="Courier New, monospace">csidl_PublicMusic</FONT>
+ </p>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<br>
+<br>
+
+<P>
+<B>Hint:</B> You can add a great amount of flexibility to a ffs_batch configuration file
+ by creating new temporary environment variables in a bat or cmd file that are evaluated by FreeFileSync at runtime.
+</P>
+
+<BR>
+
+<P><B>Example:</B>
+The FreeFileSync batch file <FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT> contains
+macro <FONT FACE="Courier New, monospace">%MyVar%</FONT> instead of an absolute target folder and is invoked by a cmd file:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">set MyVar=C:\Target<BR>
+ &quot;C:\Program files\FreeFileSync\FreeFileSync.exe&quot; C:\SyncJob.ffs_batch<BR>
+ <FONT COLOR="#808080"><I><B>::%MyVar% is resolved as C:\Target during synchronization</B></I></FONT>
+ </FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B><br>
+ Temporary environment variables created with the <FONT FACE="Courier New, monospace">set</FONT> command are only valid if the synchronization is started by calling the
+ FreeFileSync executable directly. Using <FONT FACE="Courier New, monospace">start /wait</FONT> creates a new program context without these temporal variables.
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/RealtimeSync.html b/FreeFileSync/Build/Help/html/RealtimeSync.html
new file mode 100644
index 00000000..dfb46b7b
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/RealtimeSync.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2 ALIGN=CENTER>
+<IMG SRC="../img/RTS_logo.png"><BR>
+<FONT SIZE=3><I><SPAN STYLE="font-weight: normal">Automated Synchronization</SPAN></I></FONT>
+</H2>
+
+<P>The primary purpose of RealtimeSync is to execute a command line each time a directory becomes
+available (e. g. insert of a USB-stick) <b>or</b> when it detects changes in one of the monitored directories. Usually this command line will trigger
+a FreeFileSync batch job.
+</P>
+
+<BR>
+
+<B>Example:</B> Real time synchronization - in combination with FreeFileSync<br>
+<P>
+Start RealtimeSync.exe located in FreeFileSync's installation directory and
+enter all folders you want to monitor. Instead of doing this manually you can import a ffs_batch
+file via <B>Menu &rarr; Program &rarr; Open</B>. This not only extracts all directories relevant for synchronization
+but also sets up the command line to execute the ffs_batch file each time changes are detected.
+Now press <B>Start</B> to begin monitoring.
+</P>
+<div STYLE="margin-left: 1.3cm">
+ <IMG SRC="../img/RealtimeSync.png">
+</div>
+
+<BR>
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B>
+ <ul STYLE="margin: 0">
+ <LI>The command should <B>not</B> <B>block</B> progress. If you call a FreeFileSync batch job, make
+ sure it does not show any popup windows. See notes in <A HREF="Command%20line.html">Command Line Usage</A>.
+ <BR>&nbsp;
+
+ <LI>RealtimeSync will skip showing the main dialog and begin monitoring immediately if
+ you pass a ffs_real configuration file <B>or</B> a FreeFileSync ffs_batch file as first
+ command line argument to RealtimeSync.exe. This helps you integrate RealtimeSync into your operating system's auto start:<BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Courier New, monospace">&quot;C:\Program Files\FreeFileSync\RealtimeSync.exe&quot; &quot;D:\Backup Projects.ffs_real&quot;</FONT><BR>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Courier New, monospace">&quot;C:\Program Files\FreeFileSync\RealtimeSync.exe&quot; &quot;D:\Backup Projects.ffs_batch&quot;</FONT>
+ <BR>&nbsp;
+
+ <LI>RealtimeSync is not tied to starting FreeFileSync. It can also be used in other scenarios, like sending an email whenever a certain directory is modified.
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<B>Example:</B> Automatic synchronization when a USB stick is inserted
+<P>Save a ffs_batch configuration in the USB stick's root directory,
+e.g. <FONT FACE="Courier New, monospace">H:\</FONT>, to let RealtimeSync call it when the stick is mounted. Configure RealtimeSync as follows:<BR>
+</P>
+<div STYLE="margin-left: 1.3cm">
+ <IMG SRC="../img/WatchUsbInsert.png">
+</div>
+<BR>
+
+<P>Whenever directory <FONT FACE="Courier New, monospace">H:\Data</FONT> becomes available, RealtimeSync executes the command line which starts the batch job located
+on the stick. RealtimeSync will also trigger each time files are modified in <FONT FACE="Courier New, monospace">H:\Data</FONT>.
+</P>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B><BR>
+ The full path of the last changed file and the action that triggered the
+ change notification (create, update or delete) are written
+ to the environment variables <B>%change_path%</B> and <B>%change_action%</B>.
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<P><B>Example:</B> Log names of changed files and directories (Windows)</P>
+<div class="greybox">
+ <div class="greybox_inner">
+ Show which file or directory has triggered a change. Enter command line:<BR>
+ <FONT FACE="Courier New, monospace">&nbsp;&nbsp;&nbsp;&nbsp;cmd /c echo %change_action% &quot;%change_path%&quot; &amp; pause</FONT>
+ <BR><BR>
+ Write a list of all changes to a log file:<BR>
+
+ <FONT FACE="Courier New, monospace">
+ &nbsp;&nbsp;&nbsp;&nbsp;cmd /c echo %change_action% &quot;%change_path%&quot; &gt;&gt; C:\log.txt
+ </FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <b>Note</b><br>
+ When RealtimeSync executes a Windows batch file (bat or cmd) a black console window is shown. You can hide it using the Visual Basic script
+ <FONT FACE="Courier New, monospace">HideConsole.vbs</FONT> located in FreeFileSync's installation directory:
+ <br><br>
+ <FONT FACE="Courier New, monospace">wscript &quot;C:\Program files\FreeFileSync\HideConsole.vbs&quot; C:\MyBatchFile.cmd</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<h3>Limitations:</h3>
+<UL>
+ <LI>If multiple changes happen at the same time, only the name of the first file is written to variable <b>%changed_file%</b>.
+ <LI>While RealtimeSync is executing the command line, monitoring is inactive and changes occurring during this time are lost.
+</UL>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Run as Service.html b/FreeFileSync/Build/Help/html/Run as Service.html
new file mode 100644
index 00000000..022e6463
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Run as Service.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Run as Service <SPAN STYLE="font-weight: normal">(Windows)</SPAN></H2>
+
+<P>
+ RealtimeSync is designed to run as a background process which does not need further
+ attention. Depending on your requirements there are a number of ways you can start it automatically.
+ Generally the goal is to execute a command line of the form:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">&lt;FreeFileSync installation folder&gt;\RealtimeSync.exe &lt;path to *.ffs_real or *.ffs_batch file&gt;</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<h3>Example:</h3>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">&quot;C:\Program Files\FreeFileSync\RealtimeSync.exe&quot; &quot;D:\Backup Projects.ffs_real&quot;</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<OL>
+ <LI><p>RealtimeSync should be monitoring only while a specific user is logged in: Create
+ a new shortcut, enter the command line from above as target and place it into the user's autostart folder.
+ </p>
+ <IMG SRC="../img/create_shortcut.png"><br><br>
+ <IMG SRC="../img/shortcut_properties.png">
+ <br>&nbsp;
+
+ <LI><p>RealtimeSync should be monitoring while Windows is running irrespective of
+ currently logged in users: Create a new task in your operating systems's task scheduler and have it execute the command line above
+ when the system starts. See <A HREF="Schedule%20a%20batch%20job.html">Schedule a Batch Job</A> for an example how to add a task. Then change
+ the user which runs the task to <B>SYSTEM</B> - a special user account always running in the background.
+ </p>
+ <IMG SRC="../img/schedule_realtimesync.png">
+</OL>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Schedule a Batch Job.html b/FreeFileSync/Build/Help/html/Schedule a Batch Job.html
new file mode 100644
index 00000000..96f67fe3
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Schedule a Batch Job.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="de-DE" DIR="LTR">
+
+<H2>Schedule a Batch Job</H2>
+
+<OL>
+ <LI>Create a new batch job via FreeFileSync's main dialog: <B>Menu &rarr; Program &rarr; Save as batch job...</B><BR>&nbsp;
+
+ <LI>If the batch job shall run without user interaction or as part of an
+ unattended batch script, make sure that no popup dialog stops the progress:<BR>Disable checkbox <B>Show progress dialog</B> to avoid blocking while showing
+ the result after synchronization. Alternatively you can leave this option checked and select the <i>On completion</i> action <B>Close progress dialog</B>
+ located in synchronization settings. FreeFileSync will then show a progress dialog but close it automatically when it is finished.<BR>
+ <br>
+ <B>Note:</B> Even if the progress dialog is not shown at the beginning, you can make it
+ visible <B>during</B> synchronization by double-clicking the FreeFileSync notification area icon.<BR>
+ <BR>
+ <IMG SRC="../img/SetupBatch.png">
+ <br><br>
+
+ <LI>In order to prevent error or warning popup messages from stopping progress, set <B>Handle errors</B> to either <B>Ignore</B> or <B>Stop</B>.
+ <br>&nbsp;
+
+ <LI>Setup your operating system's scheduler
+ <BR>&nbsp;
+
+ <OL TYPE=A>
+ <LI><B>Windows 7 Task Scheduler:</B>
+ <UL>
+ <LI>Go to Start and run <FONT FACE="Courier New, monospace"><B>taskschd.msc</B></FONT>.
+
+ <LI>Create a new basic task and follow the wizard.
+
+ <LI>Make <B>Program/script</B> point to the location of FreeFileSync.exe and insert the ffs_batch file into <B>Add arguments</B>.
+
+ <LI>Use quotation marks to protect spaces in path names, e.g. <FONT FACE="Courier New, monospace">&quot;D:\Backup Projects.ffs_batch&quot;</FONT><BR>
+ <BR>
+ <IMG SRC="../img/win7scheduler.png">
+ </UL>
+
+ <BR>
+
+ <div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B><BR>
+ Beginning with Windows Vista the <i>Program/script</i> always needs point to an executable file like FreeFileSync.exe even
+ if ffs_batch file association is set. If a ffs_batch file is entered instead the task will return with
+ error code 0xC1, &quot;%1 is not a valid Win32 application&quot;.
+ </div>
+ </div>
+ <BR CLEAR=LEFT>
+
+ <BR>
+
+ <LI><B>Windows XP Scheduled Tasks:</B>
+ <UL>
+ <LI VALUE=1>Go to <B>Start &rarr; Control Panel &rarr; Scheduled Tasks</B> and select <B>Add Scheduled Task</B>.
+
+ <LI>Follow the wizard and select FreeFileSync.exe as program to run.
+
+ <LI>Fill the input field <B>Run:</B>
+ <FONT FACE="Courier New, monospace">&lt;FreeFileSync installation folder&gt;\FreeFileSync.exe &lt;job name&gt;.ffs_batch</FONT><BR>
+ <BR>
+ <IMG SRC="../img/ScheduleBatch.png"><BR>&nbsp;
+ </UL>
+
+ <LI><B>Ubuntu Linux Gnome-schedule:</B>
+ <UL>
+ <LI>Install Gnome-schedule, if necessary: <FONT FACE="Courier New, monospace">sudo apt-get install gnome-schedule</FONT>
+
+ <LI>Go to <B>System &rarr; Preferences &rarr; Scheduled tasks</B>
+
+ <LI>Enter the command:
+ <FONT FACE="Courier New, monospace">&lt;FreeFileSync installation folder&gt;/FreeFileSync &lt;job name&gt;.ffs_batch</FONT><BR>
+ <BR>
+ <IMG SRC="../img/ubuntuScheduler.png">
+ </UL>
+
+ </OL>
+
+
+</OL>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Synchronize with FTP.html b/FreeFileSync/Build/Help/html/Synchronize with FTP.html
new file mode 100644
index 00000000..801b5b6f
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Synchronize with FTP.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Synchronize with FTP/WebDAV <SPAN STYLE="font-weight: normal">(Windows)</SPAN></H2>
+
+<P>FreeFileSync does not support accessing FTP volumes directly. But this
+functionality can be integrated by mapping the FTP web space to a drive letter:
+</P>
+
+<P><B>Example:</B> Use the free utility NetDrive (<A HREF="http://www.netdrive.net/">http://www.netdrive.net</A>)</P>
+
+<UL>
+ <LI>Add a <SPAN STYLE="font-style: normal"><B>New Site</B></SPAN> and specify site name, site URL, drive letter, account and password.
+ <LI>Use the newly created drive as if it were a normal hard disk.
+</UL>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B><BR>Most FTP drives set a file's time stamp to the current time when
+ synchronizing ignoring the source file's time and date. As a workaround you can do a
+ <A HREF="Expert%20Settings.html">Compare by File Size</A>.
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<br>
+<BR>
+
+<H2>Synchronize with SFTP <SPAN STYLE="font-weight: normal">(Linux)</SPAN></H2>
+
+<P>An SFTP share can be easily mapped onto a local folder for use with FreeFileSync:</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <ul STYLE="margin: 0">
+ <li>Install:<BR>
+ <FONT FACE="Courier New, monospace">sudo apt-get install sshfs<BR>&nbsp;</FONT>
+
+ <li>Mount SFTP share:<BR>
+ <FONT FACE="Courier New, monospace">sshfs ssh-account@ssh-server:&lt;path&gt; mountpoint<BR>&nbsp;</FONT>
+
+ <li>Unmount:<BR>
+ <FONT FACE="Courier New, monospace">fusermount -u mountpoint</FONT>
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Variable Drive Letters.html b/FreeFileSync/Build/Help/html/Variable Drive Letters.html
new file mode 100644
index 00000000..a93430aa
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Variable Drive Letters.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="de-DE" DIR="LTR">
+
+<H2>Variable Drive Letters</H2>
+
+<P>USB memory sticks or external hard disks often get different
+drive letters assigned when plugged into distinct computers. FreeFileSync
+offers two solutions to handle this problem:
+</P>
+
+<P><B>Option 1: </B>Specify a folder path by using the volume name:</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ Use <FONT FACE="Courier New, monospace">[ZENJU-USB]\folder</FONT> instead of <FONT FACE="Courier New, monospace">G:\folder</FONT> where ZENJU-USB
+ is the volume name of the USB stick which is currently mounted in drive <FONT FACE="Courier New, monospace">G:\</FONT>.
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B><BR>
+ It is not required to look up and enter the volume name manually. Just select the corresponding entry in the drop down menu.<br>
+ <IMG SRC="../img/VolumeName.png">
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<P><B>Option 2: </B>Use a relative directory name:</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <ul STYLE="margin: 0">
+ <li>Use <FONT FACE="Courier New, monospace">\folder</FONT> instead of <FONT FACE="Courier New, monospace">G:\folder</FONT>
+
+ <li>Save and copy synchronization settings to the USB stick: <FONT FACE="Courier New, monospace">G:\Backup.ffs_gui</FONT>
+
+ <li>Start FreeFileSync by double-clicking on <FONT FACE="Courier New, monospace">G:\Backup.ffs_gui</FONT><br>
+ </ul>
+ <br>
+ The working directory is then automatically set to <FONT FACE="Courier New, monospace">G:\</FONT> by the operating system so that the
+ relative path <FONT FACE="Courier New, monospace">\folder</FONT> will be resolved as <FONT FACE="Courier New, monospace">G:\folder</FONT> during synchronization.
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Versioning.html b/FreeFileSync/Build/Help/html/Versioning.html
new file mode 100644
index 00000000..cd1d49db
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Versioning.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>File Versioning</H2>
+
+<P>When you need to preserve files that have been deleted or overwritten it's
+often sufficient to select <B>Recycle bin</B> in synchronization
+settings. However this is only available for local drives and offers
+little control on how to store and how long to keep the files.
+FreeFileSync therefore has an additional option, <B>Versioning</B>.
+</P>
+
+<BR>
+
+<h3>1. Keep all versions of old files</h3>
+
+<P>In synchronization settings set deletion handling to <B>Versioning</B>
+and naming convention to <B>Time stamp</B>. FreeFileSync will move
+deleted files into the provided folder and add a time stamp to each
+file name. The structure of the synchronized folders is preserved so
+that old versions of a file can be conveniently accessed via a file
+browser.
+</P>
+
+<P><B>Example:</B>
+A file <FONT FACE="Courier New, monospace">Folder\File.txt</FONT> was updated three times and old versions were moved to folder <FONT FACE="Courier New, monospace">C:\Revisions</FONT>
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">
+ C:\Revisions\Folder\File.txt<B>2012-12-12 111111</B>.txt<BR>
+ C:\Revisions\Folder\File.txt<B>2012-12-12 122222</B>.txt<BR>
+ C:\Revisions\Folder\File.txt<B>2012-12-12 133333</B>.txt
+ </FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+<BR>
+
+<h3>2. Save only the most recent version</h3>
+
+<P>Set deletion handling to <B>Versioning</B> and naming convention to
+<B>Replace</B>. Deleted files will be moved to the specified folder
+without any decoration and will replace already existing older
+versions.
+</P>
+
+<BR>
+
+<h3>3. Save versions at certain intervals</h3>
+
+<P>With naming convention <B>Replace</B>
+it is possible to refine the granularity of versions to keep by adding <A HREF="Macros.html">macros</A>
+to the versioning folder path. For example you can save deleted files
+on a per sync session basis by adding the <B>%timestamp%</B> macro:
+</P>
+
+<P><B>Example:</B> Using the dynamically generated folder name <FONT FACE="Courier New, monospace">C:\Revisions\%timestamp%</FONT></P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">
+ C:\Revisions\<B>2012-12-12 111111</B>\Folder\File.txt<BR>
+ C:\Revisions\<B>2012-12-12 122222</B>\Folder\File.txt<BR>
+ C:\Revisions\<B>2012-12-12 133333</B>\Folder\File.txt
+ </FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<BR>
+
+<P>This allows for a simple manual undo by moving the deleted files from the
+last synchronization session back to their original folders. Other
+macros like <B>%date%</B> or <B>%weekday%</B> can be used to reduce the granularity
+to days and weeks.
+</P>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/Volume Shadow Copy.html b/FreeFileSync/Build/Help/html/Volume Shadow Copy.html
new file mode 100644
index 00000000..4fda439a
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/Volume Shadow Copy.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <link rel="stylesheet" type="text/css" href="base.css" >
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+
+<H2>Shadow Copy Service<SPAN STYLE="font-weight: normal"> (Windows only)</SPAN></H2>
+
+<P>FreeFileSync supports copying locked or shared files by creating a Volume Shadow
+Copy of the source drive. This feature can be configured via <B>Menu &rarr; Tools &rarr; Global settings: Copy locked files</B>.
+</P>
+
+<div class="bluebox">
+ <div class="bluebox_inner">
+ <B>Note</B>
+ <ul STYLE="margin: 0">
+ <LI>The volume snapshot created by the Volume Shadow Copy Service is used when copying locked files only.
+ <LI>Accessing the Volume Shadow Copy Service requires FreeFileSync to be started with administrator rights.
+ </ul>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+
+<br>
+<BR>
+
+<h3>Troubleshooting</h3>
+
+<P>If you experience problems using the Volume Shadow Copy Service a renewal of
+registration might help. Create and execute a cmd batch file and insert the following lines or enter directly via command line:
+</P>
+
+<div class="greybox">
+ <div class="greybox_inner">
+ <FONT FACE="Courier New, monospace">
+ cd /d %windir%\system32<BR>
+ Net stop vss<BR>
+ Net stop swprv<BR>
+ regsvr32 ole32.dll<BR>
+ regsvr32 oleaut32.dll<BR>
+ regsvr32 vss_ps.dll<BR>
+ Vssvc /register<BR>
+ regsvr32 /i swprv.dll<BR>
+ regsvr32 /i eventcls.dll<BR>
+ regsvr32 es.dll<BR>
+ regsvr32 stdprov.dll<BR>
+ regsvr32 vssui.dll<BR>
+ regsvr32 msxml.dll<BR>
+ regsvr32 msxml3.dll<BR>
+ regsvr32 msxml4.dll</FONT>
+ </div>
+</div>
+<BR CLEAR=LEFT>
+Reference: <A HREF="http://support.microsoft.com/kb/940032">http://support.microsoft.com/kb/940032</A>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/FreeFileSync/Build/Help/html/base.css b/FreeFileSync/Build/Help/html/base.css
new file mode 100644
index 00000000..c71a2ddc
--- /dev/null
+++ b/FreeFileSync/Build/Help/html/base.css
@@ -0,0 +1,49 @@
+*
+{
+}
+
+body
+{
+ font-family: Tahoma, Verdana, sans-serif;
+}
+
+h2
+{
+ font-size: 20px;
+}
+
+h3
+{
+ font-size: 17px;
+}
+
+.bluebox
+{
+ margin-left: 1.3cm;
+ float: left;
+ width: 80%;
+ border: 1px solid #000080;
+ color:black;
+ background: #ccccff;
+ padding: 0.2cm;
+}
+
+.bluebox_inner
+{
+ padding-left: 0.6cm;
+}
+
+.greybox
+{
+ margin-left: 1.3cm;
+ float: left;
+ width: 80%;
+ color:black;
+ background: #e6e6e6;
+ padding: 0.2cm;
+}
+
+.greybox_inner
+{
+ padding-left: 0.6cm;
+} \ No newline at end of file
diff --git a/BUILD/Help/img/CmpSettings.png b/FreeFileSync/Build/Help/img/CmpSettings.png
index 16c30698..16c30698 100644
--- a/BUILD/Help/img/CmpSettings.png
+++ b/FreeFileSync/Build/Help/img/CmpSettings.png
Binary files differ
diff --git a/BUILD/Help/img/CompareButton.png b/FreeFileSync/Build/Help/img/CompareButton.png
index 3fe37be1..3fe37be1 100644
--- a/BUILD/Help/img/CompareButton.png
+++ b/FreeFileSync/Build/Help/img/CompareButton.png
Binary files differ
diff --git a/BUILD/Help/img/FFS_logo.png b/FreeFileSync/Build/Help/img/FFS_logo.png
index 6a1a53e5..6a1a53e5 100644
--- a/BUILD/Help/img/FFS_logo.png
+++ b/FreeFileSync/Build/Help/img/FFS_logo.png
Binary files differ
diff --git a/BUILD/Help/img/MainDialog.png b/FreeFileSync/Build/Help/img/MainDialog.png
index 9f2f2566..9f2f2566 100644
--- a/BUILD/Help/img/MainDialog.png
+++ b/FreeFileSync/Build/Help/img/MainDialog.png
Binary files differ
diff --git a/BUILD/Help/img/RTS_logo.png b/FreeFileSync/Build/Help/img/RTS_logo.png
index 344da623..344da623 100644
--- a/BUILD/Help/img/RTS_logo.png
+++ b/FreeFileSync/Build/Help/img/RTS_logo.png
Binary files differ
diff --git a/BUILD/Help/img/RealtimeSync.png b/FreeFileSync/Build/Help/img/RealtimeSync.png
index 971baefd..971baefd 100644
--- a/BUILD/Help/img/RealtimeSync.png
+++ b/FreeFileSync/Build/Help/img/RealtimeSync.png
Binary files differ
diff --git a/BUILD/Help/img/ScheduleBatch.png b/FreeFileSync/Build/Help/img/ScheduleBatch.png
index 214a2870..214a2870 100644
--- a/BUILD/Help/img/ScheduleBatch.png
+++ b/FreeFileSync/Build/Help/img/ScheduleBatch.png
Binary files differ
diff --git a/BUILD/Help/img/SetupBatch.png b/FreeFileSync/Build/Help/img/SetupBatch.png
index e1789917..e1789917 100644
--- a/BUILD/Help/img/SetupBatch.png
+++ b/FreeFileSync/Build/Help/img/SetupBatch.png
Binary files differ
diff --git a/BUILD/Help/img/SourceTarget.png b/FreeFileSync/Build/Help/img/SourceTarget.png
index 5d8df5a4..5d8df5a4 100644
--- a/BUILD/Help/img/SourceTarget.png
+++ b/FreeFileSync/Build/Help/img/SourceTarget.png
Binary files differ
diff --git a/BUILD/Help/img/SyncConfigButton.png b/FreeFileSync/Build/Help/img/SyncConfigButton.png
index 53e4ecb1..53e4ecb1 100644
--- a/BUILD/Help/img/SyncConfigButton.png
+++ b/FreeFileSync/Build/Help/img/SyncConfigButton.png
Binary files differ
diff --git a/BUILD/Help/img/SynchronizeButton.png b/FreeFileSync/Build/Help/img/SynchronizeButton.png
index 0ab74cb8..0ab74cb8 100644
--- a/BUILD/Help/img/SynchronizeButton.png
+++ b/FreeFileSync/Build/Help/img/SynchronizeButton.png
Binary files differ
diff --git a/BUILD/Help/img/VolumeName.png b/FreeFileSync/Build/Help/img/VolumeName.png
index da39c9a5..da39c9a5 100644
--- a/BUILD/Help/img/VolumeName.png
+++ b/FreeFileSync/Build/Help/img/VolumeName.png
Binary files differ
diff --git a/BUILD/Help/img/WatchUsbInsert.png b/FreeFileSync/Build/Help/img/WatchUsbInsert.png
index 0e90278a..0e90278a 100644
--- a/BUILD/Help/img/WatchUsbInsert.png
+++ b/FreeFileSync/Build/Help/img/WatchUsbInsert.png
Binary files differ
diff --git a/BUILD/Help/img/create_shortcut.png b/FreeFileSync/Build/Help/img/create_shortcut.png
index 7b0a5e2c..7b0a5e2c 100644
--- a/BUILD/Help/img/create_shortcut.png
+++ b/FreeFileSync/Build/Help/img/create_shortcut.png
Binary files differ
diff --git a/BUILD/Help/img/schedule_realtimesync.png b/FreeFileSync/Build/Help/img/schedule_realtimesync.png
index ce52fd28..ce52fd28 100644
--- a/BUILD/Help/img/schedule_realtimesync.png
+++ b/FreeFileSync/Build/Help/img/schedule_realtimesync.png
Binary files differ
diff --git a/BUILD/Help/img/shortcut_properties.png b/FreeFileSync/Build/Help/img/shortcut_properties.png
index 77e9a773..77e9a773 100644
--- a/BUILD/Help/img/shortcut_properties.png
+++ b/FreeFileSync/Build/Help/img/shortcut_properties.png
Binary files differ
diff --git a/BUILD/Help/img/ubuntuScheduler.png b/FreeFileSync/Build/Help/img/ubuntuScheduler.png
index 82bf329f..82bf329f 100644
--- a/BUILD/Help/img/ubuntuScheduler.png
+++ b/FreeFileSync/Build/Help/img/ubuntuScheduler.png
Binary files differ
diff --git a/BUILD/Help/img/win7scheduler.png b/FreeFileSync/Build/Help/img/win7scheduler.png
index eabf331f..eabf331f 100644
--- a/BUILD/Help/img/win7scheduler.png
+++ b/FreeFileSync/Build/Help/img/win7scheduler.png
Binary files differ
diff --git a/BUILD/Languages/arabic.lng b/FreeFileSync/Build/Languages/arabic.lng
index 9a59faea..4a893332 100644
--- a/BUILD/Languages/arabic.lng
+++ b/FreeFileSync/Build/Languages/arabic.lng
@@ -7,26 +7,6 @@
<plural_definition>n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>كلا الجانبين قد تغير منذ المزامنة الأخيرة.</target>
@@ -431,12 +411,6 @@ The command is triggered if:
<source>&Start</source>
<target>&ابدأ</target>
-<source>&Retry</source>
-<target>&إعادة المحاولة</target>
-
-<source>Cancel</source>
-<target>إلغاء الأمر</target>
-
<source>About</source>
<target>حول</target>
@@ -470,6 +444,9 @@ The command is triggered if:
<source>Incorrect command line:</source>
<target>سطر أوامر خاطئ:</target>
+<source>&Retry</source>
+<target>&إعادة المحاولة</target>
+
<source>File content</source>
<target>محتوى الملف</target>
@@ -602,12 +579,22 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>العودة إلى نافذة FreeFileSync الرئيسية</target>
-<source>Serious Error</source>
-<target>خطأ فادح</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
<source>&Ignore subsequent errors</source>
<target>&تجاهلا الأخطاء المماثلة</target>
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>خطأ فادح</target>
+
<source>Check for Program Updates</source>
<target>تفقد وجود تحديثات للبرنامج</target>
@@ -629,6 +616,9 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>لم نستطع العثور على على رقم إصدار FreeFileSync على الشبكة. هل تريد التحقق يدوياً؟</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>ارتباط-رمزي</target>
@@ -758,6 +748,9 @@ The command is triggered if:
<source>Compare</source>
<target>قارن</target>
+<source>Cancel</source>
+<target>إلغاء الأمر</target>
+
<source>Synchronize</source>
<target>مزامنة</target>
@@ -1106,6 +1099,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>تأكيد</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&تنفيذ</target>
diff --git a/BUILD/Languages/chinese_simple.lng b/FreeFileSync/Build/Languages/chinese_simple.lng
index 8b5a89d6..d204ffd0 100644
--- a/BUILD/Languages/chinese_simple.lng
+++ b/FreeFileSync/Build/Languages/chinese_simple.lng
@@ -7,26 +7,6 @@
<plural_definition>0</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>在最后的同步之后两边均已改变.</target>
@@ -584,9 +564,19 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>切换至 FreeFileSync 的主窗口</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
<source>&Ignore subsequent errors</source>
<target>忽略后续的错误(&I)</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>严重错误</target>
@@ -611,6 +601,9 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>无法在线找到当前FreeFileSync版本号. 你要手动检查吗?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>符号连接</target>
@@ -1088,6 +1081,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>确认</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>排除(&E)</target>
diff --git a/BUILD/Languages/chinese_traditional.lng b/FreeFileSync/Build/Languages/chinese_traditional.lng
index 36cbd8ad..b13ffb1a 100644
--- a/BUILD/Languages/chinese_traditional.lng
+++ b/FreeFileSync/Build/Languages/chinese_traditional.lng
@@ -7,12 +7,6 @@
<plural_definition>0</plural_definition>
</header>
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>自上次同步後,兩邊均已變更過。</target>
@@ -581,6 +575,9 @@ The command is triggered if:
<source>&Ignore subsequent errors</source>
<target>忽略後續的錯誤(&I)</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>嚴重錯誤</target>
@@ -605,6 +602,9 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>找不到目前線上FreeFileSync版號!是否要手動檢查?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>符號連結</target>
diff --git a/BUILD/Languages/croatian.lng b/FreeFileSync/Build/Languages/croatian.lng
index 3bf1410c..a5458089 100644
--- a/BUILD/Languages/croatian.lng
+++ b/FreeFileSync/Build/Languages/croatian.lng
@@ -1,36 +1,12 @@
<header>
<language>Hrvatski</language>
- <translator>Miroslav Vranić</translator>
+ <translator>Slavko Blažević</translator>
<locale>hr_HR</locale>
<image>flag_croatia.png</image>
<plural_count>3</plural_count>
<plural_definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural_definition>
</header>
-<source>Unable to suspend system sleep mode.</source>
-<target></target>
-
-<source>Unable to register to receive system messages.</source>
-<target></target>
-
-<source>Restore all hidden windows and warnings?</source>
-<target></target>
-
-<source>Move</source>
-<target></target>
-
-<source>Stopped</source>
-<target></target>
-
-<source>Serious Error</source>
-<target></target>
-
-<source>Comparison Settings</source>
-<target></target>
-
-<source>Synchronization Settings</source>
-<target></target>
-
<source>
<pluralform>Do you really want to execute the command %y for one item?</pluralform>
<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
@@ -38,186 +14,6 @@
<target>
</target>
-<source>Select View</source>
-<target></target>
-
-<source>Filter Files</source>
-<target></target>
-
-<source>Main Bar</source>
-<target></target>
-
-<source>Folder Pairs</source>
-<target></target>
-
-<source>Select Time Span</source>
-<target></target>
-
-<source>Global Settings</source>
-<target></target>
-
-<source>Delete Items</source>
-<target></target>
-
-<source>Save as Batch Job</source>
-<target></target>
-
-<source>Restore hidden windows</source>
-<target></target>
-
-<source>Customize context menu:</source>
-<target></target>
-
-<source>Delay (in seconds):</source>
-<target></target>
-
-<source>Retry count:</source>
-<target></target>
-
-<source>Automatic retry on error:</source>
-<target></target>
-
-<source>Transfer file and folder permissions.</source>
-<target></target>
-
-<source>(requires administrator rights)</source>
-<target></target>
-
-<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target></target>
-
-<source>(recommended)</source>
-<target></target>
-
-<source>
-Copy to a temporary file (*.ffs_tmp) before overwriting target.
-This guarantees a consistent state even in case of a serious error.
-</source>
-<target></target>
-
-<source>The following settings are used for all synchronization jobs.</source>
-<target></target>
-
-<source>Maximum:</source>
-<target></target>
-
-<source>Minimum:</source>
-<target></target>
-
-<source>File size:</source>
-<target></target>
-
-<source>Time span:</source>
-<target></target>
-
-<source>Exclude:</source>
-<target></target>
-
-<source>Include:</source>
-<target></target>
-
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target></target>
-
-<source>&Recycle bin</source>
-<target></target>
-
-<source>How can I schedule a batch job?</source>
-<target></target>
-
-<source>Limit:</source>
-<target></target>
-
-<source>Save log:</source>
-<target></target>
-
-<source>Stop synchronization at first error</source>
-<target></target>
-
-<source>Stop</source>
-<target></target>
-
-<source>Variant:</source>
-<target></target>
-
-<source>Start synchronization now?</source>
-<target></target>
-
-<source>On completion:</source>
-<target></target>
-
-<source>Handle errors:</source>
-<target></target>
-
-<source>Show examples</source>
-<target></target>
-
-<source>Delete files:</source>
-<target></target>
-
-<source>Copy new and updated files to the right folder.</source>
-<target></target>
-
-<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
-<target></target>
-
-<source>More information</source>
-<target></target>
-
-<source>Symbolic links:</source>
-<target></target>
-
-<source>Identify equal files by comparing the file content.</source>
-<target></target>
-
-<source>Identify equal files by comparing modification time and size.</source>
-<target></target>
-
-<source>Select a variant:</source>
-<target></target>
-
-<source>Find:</source>
-<target></target>
-
-<source>Close search bar</source>
-<target></target>
-
-<source>&Check for new version</source>
-<target></target>
-
-<source>&Find...</source>
-<target></target>
-
-<source>Local Filter</source>
-<target></target>
-
-<source>Alternate Synchronization Settings</source>
-<target></target>
-
-<source>Alternate Comparison Settings</source>
-<target></target>
-
-<source>None</source>
-<target></target>
-
-<source>Active</source>
-<target></target>
-
-<source>Local filter</source>
-<target></target>
-
-<source>Alternate synchronization settings</source>
-<target></target>
-
-<source>Alternate comparison settings</source>
-<target></target>
-
-<source>Check for Program Updates</source>
-<target></target>
-
-<source>Retrying operation</source>
-<target></target>
-
<source>
<pluralform>Automatic retry in 1 second...</pluralform>
<pluralform>Automatic retry in %x seconds...</pluralform>
@@ -225,53 +21,20 @@ This guarantees a consistent state even in case of a serious error.
<target>
</target>
-<source>Switching to FreeFileSync's main window</source>
-<target></target>
-
-<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target></target>
-
-<source>Synchronization stopped</source>
-<target></target>
-
-<source>Please enter a target folder for versioning.</source>
-<target></target>
-
-<source>Incorrect command line:</source>
-<target></target>
-
-<source>Automated Synchronization</source>
-<target></target>
-
-<source>&Start</source>
-<target></target>
-
-<source>Command line:</source>
-<target></target>
-
-<source>Idle time (in seconds):</source>
-<target></target>
-
-<source>Folders to watch:</source>
+<source>Detecting abandoned lock...</source>
<target></target>
-<source>&View help</source>
+<source>Lock owner:</source>
<target></target>
-<source>Unable to create timestamp for versioning:</source>
-<target></target>
-
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target></target>
-
-<source>%x items/sec</source>
+<source>Waiting while directory is locked:</source>
<target></target>
<source>Both sides have changed since last synchronization.</source>
<target>Obje su strane promjenjene od posljednje sinkronizacije.</target>
<source>Cannot determine sync-direction:</source>
-<target>Ne mogu odrediti smijer sinkronizacije.</target>
+<target>Ne mogu odrediti smjer sinkronizacije.</target>
<source>No change since last synchronization.</source>
<target>Nema promjena od zadnje sinkronizacije.</target>
@@ -280,7 +43,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Unos podataka nije u sinkronizaciji uzevši u obzir trenutne postavke.</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
-<target>Postavljam zadani sinkronizacijski smijer: Stare datoteke će biti prepisane novim datotekama.</target>
+<target>Postavljam zadani sinkronizacijski smjer: Stare datoteke će biti prepisane novim datotekama.</target>
<source>Checking recycle bin availability for folder %x...</source>
<target>Provjeravam dosupnost koša za smeće za mapu %x...</target>
@@ -292,7 +55,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Premještam datoteku %x u koš</target>
<source>Moving symbolic link %x to the recycle bin</source>
-<target>Premještam simobličnu opveznicu %x u koš</target>
+<target>Premještam simobličnu poveznicu %x u koš</target>
<source>Deleting file %x</source>
<target>Brisanje datoteke %x</target>
@@ -318,9 +81,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot open file %x.</source>
<target>Ne mogu otvoriti datoteku %x.</target>
-<source>Error</source>
-<target>Greška</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Datoteka %x ne sadrži valjanu konfiguraciju</target>
@@ -330,12 +90,12 @@ This guarantees a consistent state even in case of a serious error.
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Config datoteka ne smije sadržavati postavke na direktorij par razini ukoliko su direktoriji upisani preko naredbene linije.</target>
-<source>Warning</source>
-<target>Oprez</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Direkotrij nemože biti postavljen za više od jedne konfigracijske datoteke.</target>
+<source>Command line</source>
+<target>Naredbena linija</target>
+
<source>Syntax:</source>
<target>Sintaksa:</target>
@@ -351,8 +111,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Any number of alternative directories for at most one config file.</source>
<target>Bilo koji broj alternativnih mapa za najviše jedanu config datoteku.</target>
-<source>Command line</source>
-<target>Naredbena linija</target>
+<source>Cannot find the following folders:</source>
+<target>Ne mogu pronaći slijedeće mape:</target>
+
+<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
+<target>Možete ignorirati ovu pogrešku te uzeti u obzir svaku mapu praznom. Mape se tada stvaraju automatski tokom sinkronizacije.</target>
<source>A folder input field is empty.</source>
<target>Polje za odabir foldera je prazno.</target>
@@ -360,12 +123,6 @@ This guarantees a consistent state even in case of a serious error.
<source>The corresponding folder will be considered as empty.</source>
<target>Odgovarajuća mapa će se smatrati prazna.</target>
-<source>Cannot find the following folders:</source>
-<target>Ne mogu pronaći slijedeće mape:</target>
-
-<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
-<target>Možete ignorirati ovu pogrešku te uzeti u obzir svaku mapu praznom. Mape se tada stvaraju automatski tokom sinkronizacije.</target>
-
<source>The following folders have dependent paths. Be careful when setting up synchronization rules:</source>
<target>Sljedeće mape imaju zavisnu putanju. Budite pažljivi prilikom postavljanja pravila za sinkronizaciju:</target>
@@ -486,9 +243,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot get process information.</source>
<target>Ne mogu dobit informacije o procesu</target>
-<source>Waiting while directory is locked (%x)...</source>
-<target>Čekam dok se direktorij zaključava (%x)...</target>
-
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -555,6 +309,9 @@ This guarantees a consistent state even in case of a serious error.
<source>/sec</source>
<target>/sek</target>
+<source>%x items/sec</source>
+<target>%x stavki/sek</target>
+
<source>Configuration file %x loaded partially only.</source>
<target>Datoteka postavki %x učitana samo djelomično</target>
@@ -582,6 +339,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Volume name %x is not part of file path %y.</source>
<target>Ime voumena %x nije dio puta datotke %y.</target>
+<source>Stop requested: Waiting for current operation to finish...</source>
+<target>Zaustavljam naredbu: Čekam trenutni zadatak da se dovrši...</target>
+
+<source>Unable to create timestamp for versioning:</source>
+<target>Nije moguća izrada vremenske oznake za označavanje:</target>
+
<source>Cannot read the following XML elements:</source>
<target>Ne mogu čitati slijedeće XML elemente</target>
@@ -597,6 +360,9 @@ This guarantees a consistent state even in case of a serious error.
<source>&Program</source>
<target>&Program</target>
+<source>&View help</source>
+<target>&Pogledaj pomoć</target>
+
<source>&About</source>
<target>&O programu</target>
@@ -616,7 +382,10 @@ This guarantees a consistent state even in case of a serious error.
<target>3. Pretisnite 'Start'.</target>
<source>To get started just import a .ffs_batch file.</source>
-<target>Za započeti uvezite .ffs slijednu datoteku.</target>
+<target>Za započeti uvezite .ffs Slijednu datoteku.</target>
+
+<source>Folders to watch:</source>
+<target>Mape za upotrebu:</target>
<source>Add folder</source>
<target>Dodaj mapu</target>
@@ -628,11 +397,17 @@ This guarantees a consistent state even in case of a serious error.
<target>Odaberi</target>
<source>Select a folder</source>
-<target>Izaberite mapu</target>
+<target>Odaberite mapu</target>
+
+<source>Idle time (in seconds):</source>
+<target>Vrijeme pripravnosti (u sekundama):</target>
<source>Idle time between last detected change and execution of command</source>
<target>Vrijeme čekanja između zadnje prepoznate promjene i izvršenja naredbe</target>
+<source>Command line:</source>
+<target>Naredbena linija:</target>
+
<source>
The command is triggered if:
- files or subfolders change
@@ -644,27 +419,30 @@ Naredba će biti pokrenuta ako se:
- nove mape pojave (npr. umetanje USB sticka)
</target>
-<source>&Retry</source>
-<target>&Ponovi</target>
+<source>&Start</source>
+<target>&Započni</target>
-<source>Cancel</source>
-<target>Odustani</target>
+<source>About</source>
+<target>O programu</target>
<source>Build: %x</source>
<target>Inačnica: %x</target>
-<source>About</source>
-<target>O programu</target>
-
<source>All files</source>
<target>Sve datoteke</target>
+<source>Automated Synchronization</source>
+<target>Automatska Sinkronizacija</target>
+
<source>Directory monitoring active</source>
<target>Nadzor direktorija je aktivan</target>
<source>Waiting until all directories are available...</source>
<target>Čekanje na dostupnost svih direktorija...</target>
+<source>Error</source>
+<target>Greška</target>
+
<source>&Restore</source>
<target>&Vrati</target>
@@ -674,6 +452,12 @@ Naredba će biti pokrenuta ako se:
<source>&Exit</source>
<target>&Izlaz</target>
+<source>Incorrect command line:</source>
+<target>Netočna naredbena linija:</target>
+
+<source>&Retry</source>
+<target>&Ponovi</target>
+
<source>File content</source>
<target>Sadržaj datoteke</target>
@@ -725,6 +509,12 @@ Naredba će biti pokrenuta ako se:
<source>Updating attributes of %x</source>
<target>Obnavljam atribute od %x</target>
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Lreiram Volume Shadow Copy za %x...</target>
+
+<source>Data verification error: %x and %y have different content.</source>
+<target>Greška pri provjeri podataka: %x i %y imaju različit sadržaj.</target>
+
<source>Cannot find %x.</source>
<target>Ne mogu pronaći %x.</target>
@@ -734,6 +524,9 @@ Naredba će biti pokrenuta ako se:
<source>Target folder input field must not be empty.</source>
<target>Odredišna mapa ne može biti prazna.</target>
+<source>Please enter a target folder for versioning.</source>
+<target>Molimo odaberite ciljnu mapu za označavanje</target>
+
<source>Source folder %x not found.</source>
<target>Izvorna mapa %x nije pronađena.</target>
@@ -761,15 +554,12 @@ Naredba će biti pokrenuta ako se:
<source>Generating database...</source>
<target>Izrađujem bazu podataka...</target>
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Lreiram Volume Shadow Copy za %x...</target>
-
-<source>Data verification error: %x and %y have different content.</source>
-<target>Greška pri provjeri podataka: %x i %y imaju različit sadržaj.</target>
-
<source>job name</source>
<target>Ime zadatka</target>
+<source>Synchronization stopped</source>
+<target>Sinkronizacija zaustavljena</target>
+
<source>Synchronization completed with errors</source>
<target>Sinkronizacija završena s greškama</target>
@@ -785,6 +575,33 @@ Naredba će biti pokrenuta ako se:
<source>Saving log file %x...</source>
<target>Spremam izješće %x...</target>
+<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
+<target>Možete prijeći na glavni prozor FreeFileSynca da bi rješili ovaj problem.</target>
+
+<source>&Don't show this warning again</source>
+<target>&Ne prikazuj više ovo upozorenje.</target>
+
+<source>&Ignore</source>
+<target>&Ignoriraj</target>
+
+<source>&Switch</source>
+<target>&Zamjeni</target>
+
+<source>Switching to FreeFileSync's main window</source>
+<target>Prebacujem na glavni prozor FreeFileSync</target>
+
+<source>&Ignore subsequent errors</source>
+<target>&Zanemari naknadne pogreške</target>
+
+<source>Retrying operation...</source>
+<target>Ponavljam operaciju...</target>
+
+<source>Serious Error</source>
+<target>Ozbiljna Pogreška</target>
+
+<source>Check for Program Updates</source>
+<target>Provjeriti Nadogradnje Programa</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Nova verzija FreeFileSync je dostupna:</target>
@@ -797,15 +614,15 @@ Naredba će biti pokrenuta ako se:
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync je ažuriran.</target>
-<source>Information</source>
-<target>Informacija</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Ne mogu se povezati na sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Ne mogu pronaći trenutnu verziju FreeFileSync-a online. Dali želite ručno potražiti?</target>
+<source>&Check</source>
+<target>&Provjeri</target>
+
<source>Symlink</source>
<target>Poveznica simbola</target>
@@ -857,6 +674,21 @@ Naredba će biti pokrenuta ako se:
<source>Hibernate</source>
<target>Hibernacija</target>
+<source>Alternate comparison settings</source>
+<target>Alternativne postavke usporedbe</target>
+
+<source>Alternate synchronization settings</source>
+<target>Alternativne postavke sinkronizacije</target>
+
+<source>Local filter</source>
+<target>Lokalni filter</target>
+
+<source>Active</source>
+<target>Aktivno</target>
+
+<source>None</source>
+<target>Ništa</target>
+
<source>Remove alternate settings</source>
<target>Ukloni alternativne postavke</target>
@@ -869,6 +701,15 @@ Naredba će biti pokrenuta ako se:
<source>Paste</source>
<target>Zalijepi</target>
+<source>Alternate Comparison Settings</source>
+<target>Alternativne Postavke Usporedbe</target>
+
+<source>Alternate Synchronization Settings</source>
+<target>Alternativne Postavke Sinkronizacije</target>
+
+<source>Local Filter</source>
+<target>Lokalni Filter</target>
+
<source>&New</source>
<target>&Novo</target>
@@ -876,7 +717,7 @@ Naredba će biti pokrenuta ako se:
<target>&Spremi</target>
<source>Save as &batch job...</source>
-<target>Spremi kao &slijedni zadatak...</target>
+<target>Spremi kao &Slijedni zadatak...</target>
<source>1. &Compare</source>
<target>1. &Usporedi</target>
@@ -890,6 +731,9 @@ Naredba će biti pokrenuta ako se:
<source>&Language</source>
<target>&Jezik</target>
+<source>&Find...</source>
+<target>&Pronađi...</target>
+
<source>&Export file list...</source>
<target>&Izvoz liste datoteka...</target>
@@ -902,9 +746,15 @@ Naredba će biti pokrenuta ako se:
<source>Check &automatically once a week</source>
<target>Provjeri &automatski jednom tjedno</target>
+<source>&Check for new version</source>
+<target>&Dostupnost nove verzije</target>
+
<source>Compare</source>
<target>Usporedi</target>
+<source>Cancel</source>
+<target>Odustani</target>
+
<source>Synchronize</source>
<target>Sinkroniziraj</target>
@@ -917,11 +767,17 @@ Naredba će biti pokrenuta ako se:
<source>Swap sides</source>
<target>Zamjeni strane</target>
+<source>Close search bar</source>
+<target>Zatvori traku pretraživanja</target>
+
+<source>Find:</source>
+<target>Pronađi:</target>
+
<source>Match case</source>
-<target>Poklopi se</target>
+<target>Identičan naziv</target>
<source>Save as batch job</source>
-<target>Spremi kao slijedni zadatak</target>
+<target>Spremi kao Slijedni zadatak</target>
<source>Hide excluded items</source>
<target>Sakrij isključene stavke</target>
@@ -941,20 +797,44 @@ Naredba će biti pokrenuta ako se:
<source>Total bytes to copy</source>
<target>Ukupno bajta za kopirati</target>
+<source>Select a variant:</source>
+<target>Odaberi opciju:</target>
+
+<source>Identify equal files by comparing modification time and size.</source>
+<target>Odredi jednake datoteke uspoređujući datum izmjene i veličinu</target>
+
+<source>Identify equal files by comparing the file content.</source>
+<target>Odredi jednake datoteke uspoređujući sadržaj datoteke.</target>
+
+<source>Symbolic links:</source>
+<target>Simbolične poveznice:</target>
+
+<source>More information</source>
+<target>Više informacija</target>
+
<source>OK</source>
<target>U redu</target>
<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
-<target>Pronađi i izvrši izmjene na obje strane. Izbrisano, premješteno te sukobe se otkrije automatski pomoću baze.</target>
+<target>Pronađi i izvrši izmjene na obje strane. Izbrisano, premješteno te sukobi se otkriju automatski pomoću baze.</target>
+
+<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
+<target>Izradi zrcalnu kopiju lijeve mape koja će se točno podudarati s desnom mapom nakon sinkronizacije.</target>
+
+<source>Copy new and updated files to the right folder.</source>
+<target>Kopiraj nove i ažurirane datoteke u desnu mapu.</target>
<source>Configure your own synchronization rules.</source>
-<target>Konfigurirajte vaša vlastita sinkronizacijska pravila.</target>
+<target>Postavite vaša vlastita sinkronizacijska pravila.</target>
<source>Detect moved files</source>
-<target>Proađene preseljene datoteke</target>
+<target>Otkrij premještene datoteke</target>
<source>Requires database files. Not supported by all file systems.</source>
-<target>Zahtjevaju se datoteke baze. Nisu podržai svi datotečni sustavi.</target>
+<target>Potrebne datoteke baze. Nije podržano kod svih datotečnih sustava.</target>
+
+<source>Delete files:</source>
+<target>Izbriši datoteke:</target>
<source>Permanent</source>
<target>Trajno</target>
@@ -966,16 +846,22 @@ Naredba će biti pokrenuta ako se:
<target>Koš</target>
<source>Back up deleted and overwritten files in the recycle bin</source>
-<target>Spremi obrisae ili prepisane datoteke u koš</target>
+<target>Spremi obrisane ili prepisane datoteke u koš</target>
<source>Versioning</source>
-<target>Označi</target>
+<target>Odabir</target>
<source>Move files to a user-defined folder</source>
<target>Premjesti datoteke u mapu određenu od korsnika</target>
<source>Naming convention:</source>
-<target>Pravilo imena:</target>
+<target>Pravilo naziva:</target>
+
+<source>Show examples</source>
+<target>Prikaži primjere</target>
+
+<source>Handle errors:</source>
+<target>Obradi pogreške:</target>
<source>Ignore</source>
<target>Ignoriraj</target>
@@ -989,6 +875,15 @@ Naredba će biti pokrenuta ako se:
<source>Show pop-up on errors or warnings</source>
<target>Prikaži skočni prozor pri greškama i upozorenjima</target>
+<source>On completion:</source>
+<target>Pri završetku:</target>
+
+<source>Start synchronization now?</source>
+<target>Započeti sinkronizaciju sada?</target>
+
+<source>Variant:</source>
+<target>Opcija:</target>
+
<source>Statistics</source>
<target>Statistika</target>
@@ -1019,36 +914,114 @@ Naredba će biti pokrenuta ako se:
<source>&Pause</source>
<target>&Pauziraj</target>
+<source>Stop</source>
+<target>Zaustavi</target>
+
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
-<target>Stvaranje batch datoteka za sinkronizaciju bez nadzora. Za početak, dvaput kliknite na ovu datoteku ili planirajte u planeru zadataka: %x</target>
+<target>Stvaranje Slijednih datoteka za sinkronizaciju bez nadzora. Za početak, dva-put kliknite na ovu datoteku ili planirajte u planeru zadataka: %x</target>
+
+<source>Stop synchronization at first error</source>
+<target>Zaustavi sinkronizaciju pri prvoj pogrešci</target>
<source>Show progress dialog</source>
<target>Prikaži napredak</target>
+<source>Save log:</source>
+<target>Spremi izvještaj:</target>
+
+<source>Limit:</source>
+<target>Granica:</target>
+
<source>Limit maximum number of log files</source>
<target>Ograniči maksimalan broj izvješća</target>
+<source>How can I schedule a batch job?</source>
+<target>Kako zakazati Slijedni zadatak?</target>
+
+<source>&Recycle bin</source>
+<target>&Koš za smeće</target>
+
<source>Delete on both sides</source>
<target>Izbriši na obje strane</target>
<source>Delete on both sides even if the file is selected on one side only</source>
<target>Izbriši na obje strane iako je označena datoteka samo na jednoj strani</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Odaberite filterska pravila za odvojiti određene datoteke iz sinkronizacije. Unesite putanju datoteka prema njihovim odgovarajućim parovima.</target>
+
+<source>Include:</source>
+<target>Obuhvati</target>
+
+<source>Exclude:</source>
+<target>Odvojiti:</target>
+
+<source>Time span:</source>
+<target>Vremenski raspon:</target>
+
+<source>File size:</source>
+<target>Veličina datoteke:</target>
+
+<source>Minimum:</source>
+<target>Minimum:</target>
+
+<source>Maximum:</source>
+<target>Maksimum:</target>
+
<source>&Clear</source>
<target>&Brisati</target>
+<source>The following settings are used for all synchronization jobs.</source>
+<target>Ove postavke se koriste za sve sinkronizacijske zadatke</target>
+
<source>Fail-safe file copy</source>
<target>Kopiranje zaštićeno od grešaka</target>
+<source>
+Copy to a temporary file (*.ffs_tmp) before overwriting target.
+This guarantees a consistent state even in case of a serious error.
+</source>
+<target>
+Kopiraj u privremenu datoteku (*.ffs_tmp) prije prepisivanja ciljne datoteke
+To jamči dosljedno stanje čak i u slučaju ozbiljne pogreške
+</target>
+
+<source>(recommended)</source>
+<target>(preporučeno)</target>
+
<source>Copy locked files</source>
<target>Kopiraj zaključane datoteke</target>
+<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
+<target>Kopiraj djeljene ili zaključane datoteke pomoću Volume Shadow Copy servisa.</target>
+
+<source>(requires administrator rights)</source>
+<target>(zahtjeva administratorske ovlasti)</target>
+
<source>Copy file access permissions</source>
<target>Kopiraj datotečna dopuštenja</target>
+<source>Transfer file and folder permissions.</source>
+<target>Dopuštenja za prijenos datoteka i foldera.</target>
+
+<source>Automatic retry on error:</source>
+<target>Automatski pokušaj pri pogrešci:</target>
+
+<source>Retry count:</source>
+<target>Broj pokušaja:</target>
+
+<source>Delay (in seconds):</source>
+<target>Odgoda (u sekundama) :</target>
+
+<source>Customize context menu:</source>
+<target>Prilagodite kontekstni izbornik</target>
+
<source>Description</source>
<target>Opis</target>
+<source>Restore hidden windows</source>
+<target>Prikaži skrivene prozore</target>
+
<source>&Default</source>
<target>&Zadano</target>
@@ -1076,6 +1049,21 @@ Naredba će biti pokrenuta ako se:
<source>Many thanks for localization:</source>
<target>Velike zahvale idu:</target>
+<source>Save as Batch Job</source>
+<target>Spremi kao Slijedni zadatak</target>
+
+<source>Delete Items</source>
+<target>Izbriši stavke</target>
+
+<source>Global Settings</source>
+<target>Globalne postavke</target>
+
+<source>Select Time Span</source>
+<target>Odaberite vremenski raspon</target>
+
+<source>Folder Pairs</source>
+<target>Parovi Foldera</target>
+
<source>Find</source>
<target>Pronađi</target>
@@ -1085,6 +1073,15 @@ Naredba će biti pokrenuta ako se:
<source>Configuration</source>
<target>Postavke</target>
+<source>Main Bar</source>
+<target>Glavna traka</target>
+
+<source>Filter Files</source>
+<target>Filtriraj datoteke</target>
+
+<source>Select View</source>
+<target>Odaberi pogled</target>
+
<source>Open...</source>
<target>Otvori...</target>
@@ -1140,7 +1137,7 @@ Naredba će biti pokrenuta ako se:
</target>
<source>Set direction:</source>
-<target>Odaberi smijer:</target>
+<target>Odaberi smjer:</target>
<source>multiple selection</source>
<target>višestruki odabir</target>
@@ -1197,17 +1194,17 @@ Naredba će biti pokrenuta ako se:
<target>Postavke spremljene</target>
<source>FreeFileSync batch</source>
-<target>FreeFileSync slijedni zadatak</target>
+<target>FreeFileSync Slijedni zadatak</target>
<source>Do you want to save changes to %x?</source>
<target>Da li želite spremiti izmjene za %x?</target>
-<source>Do&n't save</source>
-<target>&Nemoj spremiti</target>
-
<source>Never save &changes</source>
<target>Nikad ne spremaj &promjene</target>
+<source>Do&n't save</source>
+<target>&Nemoj spremiti</target>
+
<source>Filter</source>
<target>Filtriranje</target>
@@ -1230,7 +1227,7 @@ Naredba će biti pokrenuta ako se:
<target>Prikaži datoteke koje su različite</target>
<source>Show conflicts</source>
-<target>Prikaži spore</target>
+<target>Prikaži sukobe</target>
<source>Show files that will be created on the left side</source>
<target>Prikaži datoteke koje će biti napravljene na lijevoj strani</target>
@@ -1259,8 +1256,14 @@ Naredba će biti pokrenuta ako se:
<source>All folders are in sync</source>
<target>Sve mape su u sinkronizaciji</target>
+<source>Synchronization Settings</source>
+<target>Postavke Sinkronizacije</target>
+
+<source>Comparison Settings</source>
+<target>Postavke Usporedbe</target>
+
<source>Cannot find %x</source>
-<target>Nemogu pronaći %x</target>
+<target>Ne mogu pronaći %x</target>
<source>Comma-separated values</source>
<target>Zarezom odvojene vrijednosti</target>
@@ -1271,26 +1274,8 @@ Naredba će biti pokrenuta ako se:
<source>Searching for program updates...</source>
<target>Pretražujem ažuriranja programa...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Zanemari naknadne pogreške</target>
-
-<source>&Ignore</source>
-<target>&Ignoriraj</target>
-
-<source>&Don't show this warning again</source>
-<target>&Ne prikazuj više ovo upozorenje.</target>
-
-<source>&Switch</source>
-<target>&Zamjeni</target>
-
-<source>&Yes</source>
-<target>&Da</target>
-
-<source>&No</source>
-<target>&Ne</target>
-
<source>Scanning...</source>
-<target>Pregledajem...</target>
+<target>Tražim...</target>
<source>Comparing content...</source>
<target>Uspoređujem sadržaj...</target>
@@ -1298,12 +1283,21 @@ Naredba će biti pokrenuta ako se:
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Oprez</target>
+
+<source>Select all</source>
+<target>Odaberi sve</target>
+
<source>Paused</source>
<target>Pauzirano</target>
<source>Initializing...</source>
<target>Učitavam</target>
+<source>Stopped</source>
+<target>Zaustavljeno</target>
+
<source>Completed</source>
<target>Završeno</target>
@@ -1347,6 +1341,9 @@ Naredba će biti pokrenuta ako se:
<pluralform>Dali stvarno želite premjestiti sljedećih %x stavki u koš?</pluralform>
</target>
+<source>Move</source>
+<target>Premjesti</target>
+
<source>
<pluralform>Do you really want to delete the following item?</pluralform>
<pluralform>Do you really want to delete the following %x items?</pluralform>
@@ -1384,6 +1381,9 @@ Naredba će biti pokrenuta ako se:
<source>- Other side's counterpart to %item_folder%</source>
<target>- Duplikat s druge strane u %item_folder%</target>
+<source>Restore all hidden windows and warnings?</source>
+<target>Vratiti sve skrivene prozore i upozorenja?</target>
+
<source>Leave as unresolved conflict</source>
<target>Ostavi kao neriješeni sukob</target>
@@ -1391,7 +1391,7 @@ Naredba će biti pokrenuta ako se:
<target>Zamjeni</target>
<source>Move files and replace if existing</source>
-<target>Premjesti datoteke i zamjeni ako već postoji</target>
+<target>Premjesti datoteke i zamjeni ako već postoje</target>
<source>Time stamp</source>
<target>Vremenska oznaka</target>
@@ -1510,9 +1510,15 @@ Naredba će biti pokrenuta ako se:
<pluralform>%x dana</pluralform>
</target>
+<source>Unable to register to receive system messages.</source>
+<target>Nije moguće registriranje sistemskih poruka</target>
+
<source>Cannot set privilege %x.</source>
<target>Ne mogu postaviti prava za %x.</target>
+<source>Unable to suspend system sleep mode.</source>
+<target>Nije moguće obustaviti sistemsko stanje propravnosti</target>
+
<source>Cannot change process I/O priorities.</source>
<target>Ne može se promjeniti proces I/O prioriteta</target>
diff --git a/BUILD/Languages/czech.lng b/FreeFileSync/Build/Languages/czech.lng
index 1e49b62e..8e4db524 100644
--- a/BUILD/Languages/czech.lng
+++ b/FreeFileSync/Build/Languages/czech.lng
@@ -7,23 +7,6 @@
<plural_definition>n==1 ? 0 : n>=2 && n<=4 ? 1 : 2</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Došlo ke změně obou stran od poslední synchronizace.</target>
@@ -75,9 +58,6 @@
<source>Cannot open file %x.</source>
<target>Nelze otevřít soubor %x.</target>
-<source>Error</source>
-<target>Chyba</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Soubor %x neobsahuje platnou konfiguraci.</target>
@@ -87,12 +67,12 @@
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Konfigurační soubor nesmí obsahovat nastavení na úrovni adresářových párů pokud je zadán přes příkazovou řádku.</target>
-<source>Warning</source>
-<target>Varování</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Adresáře nemohou obsahovat více než jeden konfigurační soubor.</target>
+<source>Command line</source>
+<target>Příkazová řádka</target>
+
<source>Syntax:</source>
<target>Syntaxe:</target>
@@ -108,9 +88,6 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>Libovolný počet alternativních adresářů na alespoň jednu konfiguraci.</target>
-<source>Command line</source>
-<target>Příkazová řádka</target>
-
<source>A folder input field is empty.</source>
<target>Není zadána vstupní složka.</target>
@@ -425,18 +402,12 @@ Příkaz je spuštěn když:
<source>&Start</source>
<target>&Start</target>
-<source>&Retry</source>
-<target>&Opakovat</target>
-
-<source>Cancel</source>
-<target>Zrušit</target>
+<source>About</source>
+<target>O programu</target>
<source>Build: %x</source>
<target>Verze: %x</target>
-<source>About</source>
-<target>O programu</target>
-
<source>All files</source>
<target>Všechny soubory</target>
@@ -449,6 +420,9 @@ Příkaz je spuštěn když:
<source>Waiting until all directories are available...</source>
<target>Čekání na nedostupné adresáře...</target>
+<source>Error</source>
+<target>Chyba</target>
+
<source>&Restore</source>
<target>&Obnovit</target>
@@ -461,6 +435,9 @@ Příkaz je spuštěn když:
<source>Incorrect command line:</source>
<target>Neplatný příkaz:</target>
+<source>&Retry</source>
+<target>&Opakovat</target>
+
<source>File content</source>
<target>Podle obsahu souboru</target>
@@ -581,33 +558,58 @@ Příkaz je spuštěn když:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>K odstranění tohoto problému se přepněte do hlavního okna FreeFileSync.</target>
+<source>&Don't show this warning again</source>
+<target>&Nezobrazovat již příště toto varování</target>
+
+<source>&Ignore</source>
+<target>&Pokračovat</target>
+
+<source>&Switch</source>
+<target>&Přepnout</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Přepínání do hlavního okna FreeFileSync</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>Pře&skočit další chyby</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>Závažná chyba</target>
+
+<source>Check for Program Updates</source>
+<target>Hledání aktualizací programu</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Je dostupná novější verze FreeFileSync:</target>
<source>Download now?</source>
<target>Stáhnout nyní?</target>
-<source>Check for Program Updates</source>
-<target>Hledání aktualizací programu</target>
-
<source>&Download</source>
<target>&Stahování</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync je aktuální.</target>
-<source>Information</source>
-<target>Informace</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Není možné se připojit k sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Současná verze FreeFileSync nebyla nalezena online! Chcete verzi zkontrolovat ručně?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Symlink</target>
@@ -737,6 +739,9 @@ Příkaz je spuštěn když:
<source>Compare</source>
<target>Porovnání</target>
+<source>Cancel</source>
+<target>Zrušit</target>
+
<source>Synchronize</source>
<target>Synchronizace</target>
@@ -1082,6 +1087,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>Potvrdit</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Spustit</target>
@@ -1178,12 +1190,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Do you want to save changes to %x?</source>
<target>Uložit změny do %x?</target>
-<source>Do&n't save</source>
-<target>&Neukládat</target>
-
<source>Never save &changes</source>
<target>Nikdy &neukládat změny</target>
+<source>Do&n't save</source>
+<target>&Neukládat</target>
+
<source>Filter</source>
<target>Filtr</target>
@@ -1253,27 +1265,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Searching for program updates...</source>
<target>Hledání aktualizací programu ...</target>
-<source>&Ignore subsequent errors</source>
-<target>Pře&skočit další chyby</target>
-
-<source>&Ignore</source>
-<target>&Pokračovat</target>
-
-<source>Serious Error</source>
-<target>Závažná chyba</target>
-
-<source>&Don't show this warning again</source>
-<target>&Nezobrazovat již příště toto varování</target>
-
-<source>&Switch</source>
-<target>&Přepnout</target>
-
-<source>&Yes</source>
-<target>&Ano</target>
-
-<source>&No</source>
-<target>&Ne</target>
-
<source>Scanning...</source>
<target>Zpracovávání...</target>
@@ -1283,6 +1274,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Varování</target>
+
<source>Paused</source>
<target>Pauza</target>
diff --git a/BUILD/Languages/danish.lng b/FreeFileSync/Build/Languages/danish.lng
index 423b649c..092686cd 100644
--- a/BUILD/Languages/danish.lng
+++ b/FreeFileSync/Build/Languages/danish.lng
@@ -7,23 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Begge sider ændret siden sidste synkronisering.</target>
@@ -75,9 +58,6 @@
<source>Cannot open file %x.</source>
<target>Filen %x kan ikke åbnes.</target>
-<source>Error</source>
-<target>Fejl</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x indeholder ikke gyldige indstillinger.</target>
@@ -87,12 +67,12 @@
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Indstillingsfilen må ikke indeholde indstillinger på mappepar niveau når mapper er sat via kommando.</target>
-<source>Warning</source>
-<target>Advarsel</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Mapper kan ikke sættes til mere end en indstillingsfil.</target>
+<source>Command line</source>
+<target>Kommando</target>
+
<source>Syntax:</source>
<target>Syntaks:</target>
@@ -108,9 +88,6 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>Vilkårligt antal alternative mappe til højst en indstillingsfil</target>
-<source>Command line</source>
-<target>Kommando</target>
-
<source>A folder input field is empty.</source>
<target>Der er ikke valgt nogen mapper.</target>
@@ -422,18 +399,12 @@ Kommandoen udføres hvis:
<source>&Start</source>
<target>&Start</target>
-<source>&Retry</source>
-<target>&Prøv igen</target>
-
-<source>Cancel</source>
-<target>Annuller</target>
+<source>About</source>
+<target>Om</target>
<source>Build: %x</source>
<target>Udgivet: %x</target>
-<source>About</source>
-<target>Om</target>
-
<source>All files</source>
<target>Alle filer</target>
@@ -446,6 +417,9 @@ Kommandoen udføres hvis:
<source>Waiting until all directories are available...</source>
<target>Venter til alle mapper er tilgængelige...</target>
+<source>Error</source>
+<target>Fejl</target>
+
<source>&Restore</source>
<target>&Vis vindue</target>
@@ -458,6 +432,9 @@ Kommandoen udføres hvis:
<source>Incorrect command line:</source>
<target>Ugyldig kommando:</target>
+<source>&Retry</source>
+<target>&Prøv igen</target>
+
<source>File content</source>
<target>Indhold</target>
@@ -578,33 +555,58 @@ Kommandoen udføres hvis:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Skift til FreeFileSyncs hovedvindue for at løse problemet.</target>
+<source>&Don't show this warning again</source>
+<target>&Vis ikke igen</target>
+
+<source>&Ignore</source>
+<target>&Ignorer</target>
+
+<source>&Switch</source>
+<target>&Skift</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Skifter til hovedvinduet</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>&Ignorer efterfølgende fejl</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>Kritisk fejl</target>
+
+<source>Check for Program Updates</source>
+<target>Søg efter opdatering</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Opdatering tilgængelig:</target>
<source>Download now?</source>
<target>Download nu?</target>
-<source>Check for Program Updates</source>
-<target>Søg efter opdatering</target>
-
<source>&Download</source>
<target>&Download</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync er opdateret.</target>
-<source>Information</source>
-<target>Information</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Kan ikke kontakte sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Kunne ikke finde FreeFileSync's versionsnummer online. Vil du kontrollere manuelt?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Symlink</target>
@@ -734,6 +736,9 @@ Kommandoen udføres hvis:
<source>Compare</source>
<target>Analysér</target>
+<source>Cancel</source>
+<target>Annuller</target>
+
<source>Synchronize</source>
<target>Synkronisér</target>
@@ -1079,6 +1084,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>Bekræft</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Udfør</target>
@@ -1172,12 +1184,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Do you want to save changes to %x?</source>
<target>Vil du gemme ændringer i %x?</target>
-<source>Do&n't save</source>
-<target>&Gem ikke</target>
-
<source>Never save &changes</source>
<target>Gem &aldrig ændringer</target>
+<source>Do&n't save</source>
+<target>&Gem ikke</target>
+
<source>Filter</source>
<target>Filter</target>
@@ -1247,27 +1259,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Searching for program updates...</source>
<target>Søger efter opdatering...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Ignorer efterfølgende fejl</target>
-
-<source>&Ignore</source>
-<target>&Ignorer</target>
-
-<source>Serious Error</source>
-<target>Kritisk fejl</target>
-
-<source>&Don't show this warning again</source>
-<target>&Vis ikke igen</target>
-
-<source>&Switch</source>
-<target>&Skift</target>
-
-<source>&Yes</source>
-<target>&Ja</target>
-
-<source>&No</source>
-<target>&Nej</target>
-
<source>Scanning...</source>
<target>Skanner...</target>
@@ -1277,6 +1268,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Advarsel</target>
+
<source>Paused</source>
<target>Pauset</target>
diff --git a/BUILD/Languages/dutch.lng b/FreeFileSync/Build/Languages/dutch.lng
index cb0656b5..e5bd8c9e 100644
--- a/BUILD/Languages/dutch.lng
+++ b/FreeFileSync/Build/Languages/dutch.lng
@@ -7,266 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Unable to suspend system sleep mode.</source>
-<target></target>
-
-<source>Unable to register to receive system messages.</source>
-<target></target>
-
-<source>Restore all hidden windows and warnings?</source>
-<target></target>
-
-<source>Move</source>
-<target></target>
-
-<source>Stopped</source>
-<target></target>
-
-<source>Serious Error</source>
-<target></target>
-
-<source>Comparison Settings</source>
-<target></target>
-
-<source>Synchronization Settings</source>
-<target></target>
-
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Select View</source>
-<target></target>
-
-<source>Filter Files</source>
-<target></target>
-
-<source>Main Bar</source>
-<target></target>
-
-<source>Folder Pairs</source>
-<target></target>
-
-<source>Select Time Span</source>
-<target></target>
-
-<source>Global Settings</source>
-<target></target>
-
-<source>Delete Items</source>
-<target></target>
-
-<source>Save as Batch Job</source>
-<target></target>
-
-<source>Restore hidden windows</source>
-<target></target>
-
-<source>Customize context menu:</source>
-<target></target>
-
-<source>Delay (in seconds):</source>
-<target></target>
-
-<source>Retry count:</source>
-<target></target>
-
-<source>Automatic retry on error:</source>
-<target></target>
-
-<source>Transfer file and folder permissions.</source>
-<target></target>
-
-<source>(requires administrator rights)</source>
-<target></target>
-
-<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target></target>
-
-<source>(recommended)</source>
-<target></target>
-
-<source>
-Copy to a temporary file (*.ffs_tmp) before overwriting target.
-This guarantees a consistent state even in case of a serious error.
-</source>
-<target></target>
-
-<source>The following settings are used for all synchronization jobs.</source>
-<target></target>
-
-<source>Maximum:</source>
-<target></target>
-
-<source>Minimum:</source>
-<target></target>
-
-<source>File size:</source>
-<target></target>
-
-<source>Time span:</source>
-<target></target>
-
-<source>Exclude:</source>
-<target></target>
-
-<source>Include:</source>
-<target></target>
-
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target></target>
-
-<source>&Recycle bin</source>
-<target></target>
-
-<source>How can I schedule a batch job?</source>
-<target></target>
-
-<source>Limit:</source>
-<target></target>
-
-<source>Save log:</source>
-<target></target>
-
-<source>Stop synchronization at first error</source>
-<target></target>
-
-<source>Stop</source>
-<target></target>
-
-<source>Variant:</source>
-<target></target>
-
-<source>Start synchronization now?</source>
-<target></target>
-
-<source>On completion:</source>
-<target></target>
-
-<source>Handle errors:</source>
-<target></target>
-
-<source>Show examples</source>
-<target></target>
-
-<source>Delete files:</source>
-<target></target>
-
-<source>Copy new and updated files to the right folder.</source>
-<target></target>
-
-<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
-<target></target>
-
-<source>More information</source>
-<target></target>
-
-<source>Symbolic links:</source>
-<target></target>
-
-<source>Identify equal files by comparing the file content.</source>
-<target></target>
-
-<source>Identify equal files by comparing modification time and size.</source>
-<target></target>
-
-<source>Select a variant:</source>
-<target></target>
-
-<source>Find:</source>
-<target></target>
-
-<source>Close search bar</source>
-<target></target>
-
-<source>&Check for new version</source>
-<target></target>
-
-<source>&Find...</source>
-<target></target>
-
-<source>Local Filter</source>
-<target></target>
-
-<source>Alternate Synchronization Settings</source>
-<target></target>
-
-<source>Alternate Comparison Settings</source>
-<target></target>
-
-<source>None</source>
-<target></target>
-
-<source>Active</source>
-<target></target>
-
-<source>Local filter</source>
-<target></target>
-
-<source>Alternate synchronization settings</source>
-<target></target>
-
-<source>Alternate comparison settings</source>
-<target></target>
-
-<source>Check for Program Updates</source>
-<target></target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
-<source>Switching to FreeFileSync's main window</source>
-<target></target>
-
-<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target></target>
-
-<source>Synchronization stopped</source>
-<target></target>
-
-<source>Please enter a target folder for versioning.</source>
-<target></target>
-
-<source>Incorrect command line:</source>
-<target></target>
-
-<source>Automated Synchronization</source>
-<target></target>
-
-<source>&Start</source>
-<target></target>
-
-<source>Command line:</source>
-<target></target>
-
-<source>Idle time (in seconds):</source>
-<target></target>
-
-<source>Folders to watch:</source>
-<target></target>
-
-<source>&View help</source>
-<target></target>
-
-<source>Unable to create timestamp for versioning:</source>
-<target></target>
-
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target></target>
-
-<source>%x items/sec</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Beide zijdes zijn veranderd sinds de laatste synchronisatie.</target>
@@ -318,9 +58,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot open file %x.</source>
<target>Kan bestand %x niet openen.</target>
-<source>Error</source>
-<target>Fout</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Bestand %x bevat geen valide configuratie.</target>
@@ -330,12 +67,12 @@ This guarantees a consistent state even in case of a serious error.
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Het configuratiebestand mag geen instellingen bevatten voor een bestandslocatie level als bestandslocaties in de command line ingesteld zijn.</target>
-<source>Warning</source>
-<target>Waarschuwing</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Bestandslocaties kunnen niet voor meer dan een configuratiebestand gemaakt worden.</target>
+<source>Command line</source>
+<target>Opdrachtregel</target>
+
<source>Syntax:</source>
<target>Syntax:</target>
@@ -351,9 +88,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Any number of alternative directories for at most one config file.</source>
<target>Elk aantal alternatieve bestandslocaties voor een configuratiebestand.</target>
-<source>Command line</source>
-<target>Opdrachtregel</target>
-
<source>A folder input field is empty.</source>
<target>Een map invoerveld is leeg.</target>
@@ -552,6 +286,9 @@ This guarantees a consistent state even in case of a serious error.
<source>/sec</source>
<target>/sec</target>
+<source>%x items/sec</source>
+<target></target>
+
<source>Configuration file %x loaded partially only.</source>
<target>Configuratiebestand %x alleen deels geladen.</target>
@@ -579,6 +316,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Volume name %x is not part of file path %y.</source>
<target>Schijfnaam %x is geen deel van bestandspad %y.</target>
+<source>Stop requested: Waiting for current operation to finish...</source>
+<target></target>
+
+<source>Unable to create timestamp for versioning:</source>
+<target></target>
+
<source>Cannot read the following XML elements:</source>
<target>Kan de volgende XML elementen niet lezen:</target>
@@ -594,6 +337,9 @@ This guarantees a consistent state even in case of a serious error.
<source>&Program</source>
<target>&Programma</target>
+<source>&View help</source>
+<target></target>
+
<source>&About</source>
<target>&Over</target>
@@ -615,6 +361,9 @@ This guarantees a consistent state even in case of a serious error.
<source>To get started just import a .ffs_batch file.</source>
<target>Importeer een .ffs_batch bestand om te beginnen.</target>
+<source>Folders to watch:</source>
+<target></target>
+
<source>Add folder</source>
<target>Map toevoegen</target>
@@ -627,9 +376,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Select a folder</source>
<target>Selecteer een map</target>
+<source>Idle time (in seconds):</source>
+<target></target>
+
<source>Idle time between last detected change and execution of command</source>
<target>Tijd tussen de laatste gedetecteerde verandering en de uitvoering van het commando</target>
+<source>Command line:</source>
+<target></target>
+
<source>
The command is triggered if:
- files or subfolders change
@@ -641,27 +396,30 @@ De opdracht word geactiveerd als:
- nieuwe folders worden gevonden (bijvoorbeeld bij invoeging van USB stick)
</target>
-<source>&Retry</source>
-<target>&Opnieuw proberen</target>
+<source>&Start</source>
+<target></target>
-<source>Cancel</source>
-<target>Annuleren</target>
+<source>About</source>
+<target>Informatie</target>
<source>Build: %x</source>
<target>Build: %x</target>
-<source>About</source>
-<target>Informatie</target>
-
<source>All files</source>
<target>Alle bestanden</target>
+<source>Automated Synchronization</source>
+<target></target>
+
<source>Directory monitoring active</source>
<target>Bestandslocatie controle actief</target>
<source>Waiting until all directories are available...</source>
<target>Wachten tot alle bestandslocaties beschikbaar zijn...</target>
+<source>Error</source>
+<target>Fout</target>
+
<source>&Restore</source>
<target>&Herstellen</target>
@@ -671,6 +429,12 @@ De opdracht word geactiveerd als:
<source>&Exit</source>
<target>&Afsluiten</target>
+<source>Incorrect command line:</source>
+<target></target>
+
+<source>&Retry</source>
+<target>&Opnieuw proberen</target>
+
<source>File content</source>
<target>Bestandsinhoud</target>
@@ -731,6 +495,9 @@ De opdracht word geactiveerd als:
<source>Target folder input field must not be empty.</source>
<target>Doelmap mag niet leeg zijn.</target>
+<source>Please enter a target folder for versioning.</source>
+<target></target>
+
<source>Source folder %x not found.</source>
<target>Bronmap %x niet gevonden.</target>
@@ -767,6 +534,9 @@ De opdracht word geactiveerd als:
<source>job name</source>
<target>taaknaam</target>
+<source>Synchronization stopped</source>
+<target></target>
+
<source>Synchronization completed with errors</source>
<target>Synchronisatie is met fouten afgerond</target>
@@ -782,6 +552,40 @@ De opdracht word geactiveerd als:
<source>Saving log file %x...</source>
<target>Opslaan van logbestand %x...</target>
+<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
+<target></target>
+
+<source>&Don't show this warning again</source>
+<target>Laat deze &waarschuwing niet meer zien</target>
+
+<source>&Ignore</source>
+<target>&Negeren</target>
+
+<source>&Switch</source>
+<target>&Omschakelen</target>
+
+<source>Switching to FreeFileSync's main window</source>
+<target></target>
+
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>&Negeer volgende foutmeldingen</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target></target>
+
+<source>Check for Program Updates</source>
+<target></target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Er is een nieuwe versie van FreeFileSync beschikbaar:</target>
@@ -794,15 +598,15 @@ De opdracht word geactiveerd als:
<source>FreeFileSync is up to date.</source>
<target>U gebruikt de nieuwste versie van FreeFileSync.</target>
-<source>Information</source>
-<target>Informatie</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Kan geen verbinding maken met sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Kan huidige FreeFileSync versienummer niet online vinden. Wilt u handmatig controleren?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Symlink</target>
@@ -854,6 +658,21 @@ De opdracht word geactiveerd als:
<source>Hibernate</source>
<target>Slaapstand</target>
+<source>Alternate comparison settings</source>
+<target></target>
+
+<source>Alternate synchronization settings</source>
+<target></target>
+
+<source>Local filter</source>
+<target></target>
+
+<source>Active</source>
+<target></target>
+
+<source>None</source>
+<target></target>
+
<source>Remove alternate settings</source>
<target>Verwijder alternatieve instellingen</target>
@@ -866,6 +685,15 @@ De opdracht word geactiveerd als:
<source>Paste</source>
<target>Plakken</target>
+<source>Alternate Comparison Settings</source>
+<target></target>
+
+<source>Alternate Synchronization Settings</source>
+<target></target>
+
+<source>Local Filter</source>
+<target></target>
+
<source>&New</source>
<target>&Nieuw</target>
@@ -887,6 +715,9 @@ De opdracht word geactiveerd als:
<source>&Language</source>
<target>&Taal</target>
+<source>&Find...</source>
+<target></target>
+
<source>&Export file list...</source>
<target>&Exporteer bestandslijst...</target>
@@ -899,9 +730,15 @@ De opdracht word geactiveerd als:
<source>Check &automatically once a week</source>
<target>Controleer &automatisch eens per week</target>
+<source>&Check for new version</source>
+<target></target>
+
<source>Compare</source>
<target>Vergelijk</target>
+<source>Cancel</source>
+<target>Annuleren</target>
+
<source>Synchronize</source>
<target>Synchroniseer</target>
@@ -914,6 +751,12 @@ De opdracht word geactiveerd als:
<source>Swap sides</source>
<target>Wissel zijdes</target>
+<source>Close search bar</source>
+<target></target>
+
+<source>Find:</source>
+<target></target>
+
<source>Match case</source>
<target>Hoofdlettergevoelig</target>
@@ -938,12 +781,33 @@ De opdracht word geactiveerd als:
<source>Total bytes to copy</source>
<target>Aantal bytes om te kopiëren</target>
+<source>Select a variant:</source>
+<target></target>
+
+<source>Identify equal files by comparing modification time and size.</source>
+<target></target>
+
+<source>Identify equal files by comparing the file content.</source>
+<target></target>
+
+<source>Symbolic links:</source>
+<target></target>
+
+<source>More information</source>
+<target></target>
+
<source>OK</source>
<target>OK</target>
<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
<target>Identificeer en pas veranderingen toe aan beide kanten. Verwijderingen, verplaatsingen en conflicten worden automatisch gevonden met behulp van een database.</target>
+<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
+<target></target>
+
+<source>Copy new and updated files to the right folder.</source>
+<target></target>
+
<source>Configure your own synchronization rules.</source>
<target>Configureer uw eigen synchronisatieregels.</target>
@@ -953,6 +817,9 @@ De opdracht word geactiveerd als:
<source>Requires database files. Not supported by all file systems.</source>
<target>Heeft database bestanden nodig. Wordt niet ondersteund door alle bestandssystemen</target>
+<source>Delete files:</source>
+<target></target>
+
<source>Permanent</source>
<target>Permanent</target>
@@ -974,6 +841,12 @@ De opdracht word geactiveerd als:
<source>Naming convention:</source>
<target>Naamgevingsconventie</target>
+<source>Show examples</source>
+<target></target>
+
+<source>Handle errors:</source>
+<target></target>
+
<source>Ignore</source>
<target>Negeer</target>
@@ -986,6 +859,15 @@ De opdracht word geactiveerd als:
<source>Show pop-up on errors or warnings</source>
<target>Laat pop-up zien bij foutmeldingen of waarschuwingen</target>
+<source>On completion:</source>
+<target></target>
+
+<source>Start synchronization now?</source>
+<target></target>
+
+<source>Variant:</source>
+<target></target>
+
<source>Statistics</source>
<target>Statistieken</target>
@@ -1016,36 +898,111 @@ De opdracht word geactiveerd als:
<source>&Pause</source>
<target>&Pauze</target>
+<source>Stop</source>
+<target></target>
+
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Maak een batchbestand voor onbeheerde synchronisatie. Om te starten dubbelklikt u dit bestand of rooster in een taakplanner: %x</target>
+<source>Stop synchronization at first error</source>
+<target></target>
+
<source>Show progress dialog</source>
<target>Toon voortgangsdialoogvenster</target>
+<source>Save log:</source>
+<target></target>
+
+<source>Limit:</source>
+<target></target>
+
<source>Limit maximum number of log files</source>
<target>Limiteer maximaal aantal log bestanden</target>
+<source>How can I schedule a batch job?</source>
+<target></target>
+
+<source>&Recycle bin</source>
+<target></target>
+
<source>Delete on both sides</source>
<target>Verwijder aan beide zijdes</target>
<source>Delete on both sides even if the file is selected on one side only</source>
<target>Verwijder aan beide zijdes ook al is het bestand maar aan één zijde geselecteerd</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target></target>
+
+<source>Include:</source>
+<target></target>
+
+<source>Exclude:</source>
+<target></target>
+
+<source>Time span:</source>
+<target></target>
+
+<source>File size:</source>
+<target></target>
+
+<source>Minimum:</source>
+<target></target>
+
+<source>Maximum:</source>
+<target></target>
+
<source>&Clear</source>
<target>&Leegmaken</target>
+<source>The following settings are used for all synchronization jobs.</source>
+<target></target>
+
<source>Fail-safe file copy</source>
<target>Fail-safe bestandskopie</target>
+<source>
+Copy to a temporary file (*.ffs_tmp) before overwriting target.
+This guarantees a consistent state even in case of a serious error.
+</source>
+<target></target>
+
+<source>(recommended)</source>
+<target></target>
+
<source>Copy locked files</source>
<target>Kopiëer vergrendelde bestanden</target>
+<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
+<target></target>
+
+<source>(requires administrator rights)</source>
+<target></target>
+
<source>Copy file access permissions</source>
<target>Kopiëer toegangsrechten van bestand.</target>
+<source>Transfer file and folder permissions.</source>
+<target></target>
+
+<source>Automatic retry on error:</source>
+<target></target>
+
+<source>Retry count:</source>
+<target></target>
+
+<source>Delay (in seconds):</source>
+<target></target>
+
+<source>Customize context menu:</source>
+<target></target>
+
<source>Description</source>
<target>Omschrijving</target>
+<source>Restore hidden windows</source>
+<target></target>
+
<source>&Default</source>
<target>&Standaard</target>
@@ -1073,6 +1030,21 @@ De opdracht word geactiveerd als:
<source>Many thanks for localization:</source>
<target>Veel dank voor de vertalingen:</target>
+<source>Save as Batch Job</source>
+<target></target>
+
+<source>Delete Items</source>
+<target></target>
+
+<source>Global Settings</source>
+<target></target>
+
+<source>Select Time Span</source>
+<target></target>
+
+<source>Folder Pairs</source>
+<target></target>
+
<source>Find</source>
<target>Vind</target>
@@ -1082,6 +1054,15 @@ De opdracht word geactiveerd als:
<source>Configuration</source>
<target>Configuratie</target>
+<source>Main Bar</source>
+<target></target>
+
+<source>Filter Files</source>
+<target></target>
+
+<source>Select View</source>
+<target></target>
+
<source>Open...</source>
<target>Open...</target>
@@ -1103,6 +1084,13 @@ De opdracht word geactiveerd als:
<source>Confirm</source>
<target>Bevestigen</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Uitvoeren</target>
@@ -1196,12 +1184,12 @@ De opdracht word geactiveerd als:
<source>Do you want to save changes to %x?</source>
<target>Wilt u de wijzigingen in %x opslaan?</target>
-<source>Do&n't save</source>
-<target>&Niet opslaan</target>
-
<source>Never save &changes</source>
<target>Sla &veranderingen nooit op</target>
+<source>Do&n't save</source>
+<target>&Niet opslaan</target>
+
<source>Filter</source>
<target>Filter</target>
@@ -1253,6 +1241,12 @@ De opdracht word geactiveerd als:
<source>All folders are in sync</source>
<target>Alle mappen zijn gesynchroniseerd</target>
+<source>Synchronization Settings</source>
+<target></target>
+
+<source>Comparison Settings</source>
+<target></target>
+
<source>Cannot find %x</source>
<target>Kan %x niet vinden</target>
@@ -1265,24 +1259,6 @@ De opdracht word geactiveerd als:
<source>Searching for program updates...</source>
<target>Bezig met zoeken naar programma updates...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Negeer volgende foutmeldingen</target>
-
-<source>&Ignore</source>
-<target>&Negeren</target>
-
-<source>&Don't show this warning again</source>
-<target>Laat deze &waarschuwing niet meer zien</target>
-
-<source>&Switch</source>
-<target>&Omschakelen</target>
-
-<source>&Yes</source>
-<target>&Ja</target>
-
-<source>&No</source>
-<target>&Nee</target>
-
<source>Scanning...</source>
<target>Doorzoekt...</target>
@@ -1292,12 +1268,18 @@ De opdracht word geactiveerd als:
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Waarschuwing</target>
+
<source>Paused</source>
<target>Gepauzeerd</target>
<source>Initializing...</source>
<target>Initialiseren...</target>
+<source>Stopped</source>
+<target></target>
+
<source>Completed</source>
<target>Voltooid</target>
@@ -1340,6 +1322,9 @@ De opdracht word geactiveerd als:
<pluralform>Wilt u echt de volgende %x items naar de prullenbak verplaatsen?</pluralform>
</target>
+<source>Move</source>
+<target></target>
+
<source>
<pluralform>Do you really want to delete the following item?</pluralform>
<pluralform>Do you really want to delete the following %x items?</pluralform>
@@ -1376,6 +1361,9 @@ De opdracht word geactiveerd als:
<source>- Other side's counterpart to %item_folder%</source>
<target>- Tegenhanger van de andere kant naar %item_folder%</target>
+<source>Restore all hidden windows and warnings?</source>
+<target></target>
+
<source>Leave as unresolved conflict</source>
<target>Beschouw als onopgelost conflict</target>
@@ -1499,9 +1487,15 @@ De opdracht word geactiveerd als:
<pluralform>%x dagen</pluralform>
</target>
+<source>Unable to register to receive system messages.</source>
+<target></target>
+
<source>Cannot set privilege %x.</source>
<target>Kan privilege %x niet instellen.</target>
+<source>Unable to suspend system sleep mode.</source>
+<target></target>
+
<source>Cannot change process I/O priorities.</source>
<target>Kan de I/O prioriteiten niet aanpassen.</target>
diff --git a/BUILD/Languages/english_uk.lng b/FreeFileSync/Build/Languages/english_uk.lng
index 71e8c67e..c793b010 100644
--- a/BUILD/Languages/english_uk.lng
+++ b/FreeFileSync/Build/Languages/english_uk.lng
@@ -58,9 +58,6 @@
<source>Cannot open file %x.</source>
<target>Cannot open file %x.</target>
-<source>Error</source>
-<target>Error</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>File %x does not contain a valid configuration.</target>
@@ -70,12 +67,12 @@
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>The config file must not contain settings at directory pair level when directories are set via command line.</target>
-<source>Warning</source>
-<target>Warning</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Directories cannot be set for more than one configuration file.</target>
+<source>Command line</source>
+<target>Command line</target>
+
<source>Syntax:</source>
<target>Syntax:</target>
@@ -91,8 +88,11 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>Any number of alternative directories for at most one config file.</target>
-<source>Command line</source>
-<target>Command line</target>
+<source>Cannot find the following folders:</source>
+<target>Cannot find the following folders:</target>
+
+<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
+<target>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronisation.</target>
<source>A folder input field is empty.</source>
<target>A folder input field is empty.</target>
@@ -100,12 +100,6 @@
<source>The corresponding folder will be considered as empty.</source>
<target>The corresponding folder will be considered as empty.</target>
-<source>Cannot find the following folders:</source>
-<target>Cannot find the following folders:</target>
-
-<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
-<target>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronisation.</target>
-
<source>The following folders have dependent paths. Be careful when setting up synchronization rules:</source>
<target>The following folders have dependent paths. Be careful when setting up synchronisation rules:</target>
@@ -226,8 +220,11 @@
<source>Cannot get process information.</source>
<target>Cannot get process information.</target>
-<source>Waiting while directory is locked (%x)...</source>
-<target>Waiting while directory is locked (%x)...</target>
+<source>Waiting while directory is locked:</source>
+<target>Waiting while directory is locked:</target>
+
+<source>Lock owner:</source>
+<target>Lock owner:</target>
<source>
<pluralform>1 sec</pluralform>
@@ -238,6 +235,9 @@
<pluralform>%x sec</pluralform>
</target>
+<source>Detecting abandoned lock...</source>
+<target>Detecting abandoned lock...</target>
+
<source>Creating file %x</source>
<target>Creating file %x</target>
@@ -405,18 +405,12 @@ The command is triggered if:
<source>&Start</source>
<target>&Start</target>
-<source>&Retry</source>
-<target>&Retry</target>
-
-<source>Cancel</source>
-<target>Cancel</target>
+<source>About</source>
+<target>About</target>
<source>Build: %x</source>
<target>Build: %x</target>
-<source>About</source>
-<target>About</target>
-
<source>All files</source>
<target>All files</target>
@@ -429,6 +423,9 @@ The command is triggered if:
<source>Waiting until all directories are available...</source>
<target>Waiting until all directories are available...</target>
+<source>Error</source>
+<target>Error</target>
+
<source>&Restore</source>
<target>&Restore</target>
@@ -441,6 +438,9 @@ The command is triggered if:
<source>Incorrect command line:</source>
<target>Incorrect command line:</target>
+<source>&Retry</source>
+<target>&Retry</target>
+
<source>File content</source>
<target>File content</target>
@@ -492,6 +492,12 @@ The command is triggered if:
<source>Updating attributes of %x</source>
<target>Updating attributes of %x</target>
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Creating a Volume Shadow Copy for %x...</target>
+
+<source>Data verification error: %x and %y have different content.</source>
+<target>Data verification error: %x and %y have different content.</target>
+
<source>Cannot find %x.</source>
<target>Cannot find %x.</target>
@@ -531,12 +537,6 @@ The command is triggered if:
<source>Generating database...</source>
<target>Generating database...</target>
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Creating a Volume Shadow Copy for %x...</target>
-
-<source>Data verification error: %x and %y have different content.</source>
-<target>Data verification error: %x and %y have different content.</target>
-
<source>job name</source>
<target>job name</target>
@@ -561,6 +561,15 @@ The command is triggered if:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>You can switch to FreeFileSync's main window to resolve this issue.</target>
+<source>&Don't show this warning again</source>
+<target>&Don't show this warning again</target>
+
+<source>&Ignore</source>
+<target>&Ignore</target>
+
+<source>&Switch</source>
+<target>&Switch</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Switching to FreeFileSync's main window</target>
@@ -573,8 +582,17 @@ The command is triggered if:
<pluralform>Automatic retry in %x seconds...</pluralform>
</target>
-<source>Retrying operation</source>
-<target>Retrying operation</target>
+<source>&Ignore subsequent errors</source>
+<target>&Ignore subsequent errors</target>
+
+<source>Retrying operation...</source>
+<target>Retrying operation...</target>
+
+<source>Serious Error</source>
+<target>Serious Error</target>
+
+<source>Check for Program Updates</source>
+<target>Check for Program Updates</target>
<source>A new version of FreeFileSync is available:</source>
<target>A new version of FreeFileSync is available:</target>
@@ -582,24 +600,21 @@ The command is triggered if:
<source>Download now?</source>
<target>Download now?</target>
-<source>Check for Program Updates</source>
-<target>Check for Program Updates</target>
-
<source>&Download</source>
<target>&Download</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync is up to date.</target>
-<source>Information</source>
-<target>Information</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Unable to connect to sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Cannot find current FreeFileSync version number online. Do you want to check manually?</target>
+<source>&Check</source>
+<target>&Check</target>
+
<source>Symlink</source>
<target>Symlink</target>
@@ -729,6 +744,9 @@ The command is triggered if:
<source>Compare</source>
<target>Compare</target>
+<source>Cancel</source>
+<target>Cancel</target>
+
<source>Synchronize</source>
<target>Synchronise</target>
@@ -1074,6 +1092,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Start synchronization</source>
<target>Start synchronisation</target>
+<source>Confirm</source>
+<target>Confirm</target>
+
<source>
<pluralform>Do you really want to execute the command %y for one item?</pluralform>
<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
@@ -1083,9 +1104,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
</target>
-<source>Confirm</source>
-<target>Confirm</target>
-
<source>&Execute</source>
<target>&Execute</target>
@@ -1179,12 +1197,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Do you want to save changes to %x?</source>
<target>Do you want to save changes to %x?</target>
-<source>Do&n't save</source>
-<target>Do&n't save</target>
-
<source>Never save &changes</source>
<target>Never save &changes</target>
+<source>Do&n't save</source>
+<target>Do&n't save</target>
+
<source>Filter</source>
<target>Filter</target>
@@ -1254,27 +1272,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Searching for program updates...</source>
<target>Searching for program updates...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Ignore subsequent errors</target>
-
-<source>&Ignore</source>
-<target>&Ignore</target>
-
-<source>Serious Error</source>
-<target>Serious Error</target>
-
-<source>&Don't show this warning again</source>
-<target>&Don't show this warning again</target>
-
-<source>&Switch</source>
-<target>&Switch</target>
-
-<source>&Yes</source>
-<target>&Yes</target>
-
-<source>&No</source>
-<target>&No</target>
-
<source>Scanning...</source>
<target>Scanning...</target>
@@ -1284,6 +1281,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Warning</target>
+
+<source>Select all</source>
+<target>Select all</target>
+
<source>Paused</source>
<target>Paused</target>
diff --git a/BUILD/Languages/finnish.lng b/FreeFileSync/Build/Languages/finnish.lng
index 45b3b9fc..eae610ca 100644
--- a/BUILD/Languages/finnish.lng
+++ b/FreeFileSync/Build/Languages/finnish.lng
@@ -7,26 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Molemmat puolet muuttuneet edellisestä täsmäyksestä.</target>
@@ -587,9 +567,19 @@ Käsky suoritetaan jos:
<source>Switching to FreeFileSync's main window</source>
<target>Vaihdä FreeFileSync -pääikkunaan</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
<source>&Ignore subsequent errors</source>
<target>&Hylkää toistuvat virheet</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Vakava virhe</target>
@@ -614,6 +604,9 @@ Käsky suoritetaan jos:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Nykyinen FreeFileSync versio ei löydy verkosta, etsitäänkö manuaalisesti?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Pikakuvake</target>
@@ -833,8 +826,8 @@ Käsky suoritetaan jos:
<source>Delete or overwrite files permanently</source>
<target>Poista tai korvaa tiedostoja pysyvästi</target>
-<source>&Recycle bin</source>
-<target>&Roskakori</target>
+<source>Recycle bin</source>
+<target></target>
<source>Back up deleted and overwritten files in the recycle bin</source>
<target>Tallenna poistetut/ylikirjoitetut tiedostot Roskakoriin</target>
@@ -929,6 +922,9 @@ Käsky suoritetaan jos:
<source>How can I schedule a batch job?</source>
<target>Miten ajastan eräajon?</target>
+<source>&Recycle bin</source>
+<target>&Roskakori</target>
+
<source>Delete on both sides</source>
<target>Poista molemmilta puolilta</target>
@@ -1091,6 +1087,13 @@ Tällä varmistetaa eheys vaikka vakava virhe tapahtuisi.
<source>Confirm</source>
<target>Vahvista</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Suorita</target>
diff --git a/BUILD/Languages/french.lng b/FreeFileSync/Build/Languages/french.lng
index d040b728..b0fa82e5 100644
--- a/BUILD/Languages/french.lng
+++ b/FreeFileSync/Build/Languages/french.lng
@@ -7,23 +7,6 @@
<plural_definition>n <= 1 ? 0 : 1</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Les deux côtés ont changé depuis la dernière synchronisation.</target>
@@ -75,9 +58,6 @@
<source>Cannot open file %x.</source>
<target>Impossible d'ouvrir le fichier %x.</target>
-<source>Error</source>
-<target>Erreur</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Le fichier %x ne contient pas une configuration valide.</target>
@@ -87,12 +67,12 @@
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Le fichier de configuration ne peut pas contenir de paramètres au niveau de paires de répertoires quand ceux-ci sont définis par une ligne de commande.</target>
-<source>Warning</source>
-<target>Attention</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Les répertoires ne peuvent pas être définis pour plus d'un fichier de configuration.</target>
+<source>Command line</source>
+<target>Ligne de commande</target>
+
<source>Syntax:</source>
<target>Syntaxe :</target>
@@ -108,9 +88,6 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>N'importe quel nombre de répertoires alternatifs pour au plus un fichier de configuration.</target>
-<source>Command line</source>
-<target>Ligne de commande</target>
-
<source>A folder input field is empty.</source>
<target>Une entrée dossier est vide.</target>
@@ -422,18 +399,12 @@ La commande est déclenchée si :
<source>&Start</source>
<target>&Démarrer</target>
-<source>&Retry</source>
-<target>&Réessayer</target>
-
-<source>Cancel</source>
-<target>Annuler</target>
+<source>About</source>
+<target>A propos de</target>
<source>Build: %x</source>
<target>Généré : %x</target>
-<source>About</source>
-<target>A propos de</target>
-
<source>All files</source>
<target>Tous les fichiers</target>
@@ -446,6 +417,9 @@ La commande est déclenchée si :
<source>Waiting until all directories are available...</source>
<target>En attente de la disponibilité de tous les répertoires ...</target>
+<source>Error</source>
+<target>Erreur</target>
+
<source>&Restore</source>
<target>&Restaurer</target>
@@ -458,6 +432,9 @@ La commande est déclenchée si :
<source>Incorrect command line:</source>
<target>Ligne de commande incorrecte :</target>
+<source>&Retry</source>
+<target>&Réessayer</target>
+
<source>File content</source>
<target>Contenu du fichier</target>
@@ -578,33 +555,58 @@ La commande est déclenchée si :
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Vous pouvez basculer vers la fenêtre principale de FreeFileSync pour résoudre ce problème.</target>
+<source>&Don't show this warning again</source>
+<target>&Ne plus afficher cet avertissement</target>
+
+<source>&Ignore</source>
+<target>&Ignorer</target>
+
+<source>&Switch</source>
+<target>&Changer</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Basculer vers la fenêtre principale de FreeFileSync</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>&Ignorer les erreurs suivantes</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>Erreur Grave</target>
+
+<source>Check for Program Updates</source>
+<target>Recherche des Mises à Jour</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Une nouvelle version de FreeFileSync est disponible</target>
<source>Download now?</source>
<target>Télécharger maintenant ?</target>
-<source>Check for Program Updates</source>
-<target>Recherche des Mises à Jour</target>
-
<source>&Download</source>
<target>&Télécharger</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync est à jour.</target>
-<source>Information</source>
-<target>Information</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Impossible de se connecter à sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Impossible de trouver en ligne une nouvelle version de FreeFileSync.Voulez-vous le faire manuellement ?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Lien symbolique</target>
@@ -734,6 +736,9 @@ La commande est déclenchée si :
<source>Compare</source>
<target>Comparer</target>
+<source>Cancel</source>
+<target>Annuler</target>
+
<source>Synchronize</source>
<target>Synchroniser</target>
@@ -1082,6 +1087,13 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Confirm</source>
<target>Confirmer</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Exécuter</target>
@@ -1175,12 +1187,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Do you want to save changes to %x?</source>
<target>Voulez-vous enregistrer les modifications dans %x ?</target>
-<source>Do&n't save</source>
-<target>&Ne pas Sauvegarder</target>
-
<source>Never save &changes</source>
<target>Ne jamais sauvegarder les &modifications</target>
+<source>Do&n't save</source>
+<target>&Ne pas Sauvegarder</target>
+
<source>Filter</source>
<target>Filtre</target>
@@ -1250,27 +1262,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Searching for program updates...</source>
<target>Recherche de mises à jour ...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Ignorer les erreurs suivantes</target>
-
-<source>&Ignore</source>
-<target>&Ignorer</target>
-
-<source>Serious Error</source>
-<target>Erreur Grave</target>
-
-<source>&Don't show this warning again</source>
-<target>&Ne plus afficher cet avertissement</target>
-
-<source>&Switch</source>
-<target>&Changer</target>
-
-<source>&Yes</source>
-<target>&Oui</target>
-
-<source>&No</source>
-<target>&Non</target>
-
<source>Scanning...</source>
<target>Lecture en cours...</target>
@@ -1280,6 +1271,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Attention</target>
+
<source>Paused</source>
<target>En pause</target>
diff --git a/BUILD/Languages/german.lng b/FreeFileSync/Build/Languages/german.lng
index ca271765..3a8e264e 100644
--- a/BUILD/Languages/german.lng
+++ b/FreeFileSync/Build/Languages/german.lng
@@ -7,12 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>&Check</source>
-<target>&Prüfen</target>
-
-<source>Syntax error</source>
-<target>Syntaxfehler</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Beide Seiten wurden seit der letzten Synchronisation verändert.</target>
@@ -58,6 +52,9 @@
<source>A directory path is expected after %x.</source>
<target>Ein Verzeichnispfad wird nach %x erwartet.</target>
+<source>Syntax error</source>
+<target>Syntaxfehler</target>
+
<source>Cannot open file %x.</source>
<target>Die Datei %x kann nicht geöffnet werden.</target>
@@ -91,18 +88,18 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>Beliebige Anzahl von alternativen Verzeichnissen für höchstens eine Konfigurationsdatei.</target>
-<source>A folder input field is empty.</source>
-<target>Ein Ordnereingabefeld ist leer.</target>
-
-<source>The corresponding folder will be considered as empty.</source>
-<target>Der entsprechende Ordner wird als leer angesehen.</target>
-
<source>Cannot find the following folders:</source>
<target>Die folgenden Ordner wurden nicht gefunden:</target>
<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
<target>Dieser Fehler kann ignoriert werden, um die Ordner als leer anzusehen und beim Synchronisieren automatisch zu erstellen.</target>
+<source>A folder input field is empty.</source>
+<target>Ein Ordnereingabefeld ist leer.</target>
+
+<source>The corresponding folder will be considered as empty.</source>
+<target>Der entsprechende Ordner wird als leer angesehen.</target>
+
<source>The following folders have dependent paths. Be careful when setting up synchronization rules:</source>
<target>Die folgenden Ordner haben abhängige Pfade. Achtung beim Festlegen der Synchronisationsregeln:</target>
@@ -223,8 +220,11 @@
<source>Cannot get process information.</source>
<target>Prozessinformationen können nicht gelesen werden.</target>
-<source>Waiting while directory is locked (%x)...</source>
-<target>Warte während Verzeichnis gesperrt ist (%x)...</target>
+<source>Waiting while directory is locked:</source>
+<target>Warte während das Verzeichnis gesperrt ist:</target>
+
+<source>Lock owner:</source>
+<target>Sperreigentümer:</target>
<source>
<pluralform>1 sec</pluralform>
@@ -235,6 +235,9 @@
<pluralform>%x Sek.</pluralform>
</target>
+<source>Detecting abandoned lock...</source>
+<target>Ermittle aufgegebene Sperre...</target>
+
<source>Creating file %x</source>
<target>Erstelle Datei %x</target>
@@ -402,12 +405,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>&Start</source>
<target>&Start</target>
-<source>&Retry</source>
-<target>&Wiederholen</target>
-
-<source>Cancel</source>
-<target>Abbrechen</target>
-
<source>About</source>
<target>Über</target>
@@ -441,6 +438,9 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Incorrect command line:</source>
<target>Ungültige Befehlszeile:</target>
+<source>&Retry</source>
+<target>&Wiederholen</target>
+
<source>File content</source>
<target>Dateiinhalt</target>
@@ -492,6 +492,12 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Updating attributes of %x</source>
<target>Aktualisiere Attribute von %x</target>
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Erstelle eine Volumenschattenkopie für %x...</target>
+
+<source>Data verification error: %x and %y have different content.</source>
+<target>Verifizierungsfehler: %x und %y haben unterschiedlichen Inhalt.</target>
+
<source>Cannot find %x.</source>
<target>%x wurde nicht gefunden.</target>
@@ -531,12 +537,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Generating database...</source>
<target>Erzeuge Synchronisationsdatenbank...</target>
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Erstelle eine Volumenschattenkopie für %x...</target>
-
-<source>Data verification error: %x and %y have different content.</source>
-<target>Verifizierungsfehler: %x und %y haben unterschiedlichen Inhalt.</target>
-
<source>job name</source>
<target>Auftragsname</target>
@@ -556,11 +556,20 @@ Die Befehlszeile wird ausgelöst, wenn:
<target>Synchronisation erfolgreich abgeschlossen</target>
<source>Saving log file %x...</source>
-<target>Speichere Logdatei %x...</target>
+<target>Speichere Protokolldatei %x...</target>
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Sie können auf FreeFileSyncs Hauptfenster wechseln, um das Problem zu beheben.</target>
+<source>&Don't show this warning again</source>
+<target>&Diese Warnung nicht mehr anzeigen</target>
+
+<source>&Ignore</source>
+<target>&Ignorieren</target>
+
+<source>&Switch</source>
+<target>&Wechseln</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Wechsle auf FreeFileSyncs Hauptfenster</target>
@@ -573,9 +582,15 @@ Die Befehlszeile wird ausgelöst, wenn:
<pluralform>Automatische Wiederholung in %x Sekunden...</pluralform>
</target>
+<source>&Ignore subsequent errors</source>
+<target>&Nachfolgende Fehler ignorieren</target>
+
<source>Retrying operation...</source>
<target>Wiederhole Operation...</target>
+<source>Serious Error</source>
+<target>Schwerer Fehler</target>
+
<source>Check for Program Updates</source>
<target>Suche nach neuer Programmversion</target>
@@ -597,6 +612,9 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Die aktuelle FreeFileSync Versionsnummer wurde online nicht gefunden. Möchten Sie manuell prüfen?</target>
+<source>&Check</source>
+<target>&Prüfen</target>
+
<source>Symlink</source>
<target>Symlink</target>
@@ -726,6 +744,9 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Compare</source>
<target>Vergleichen</target>
+<source>Cancel</source>
+<target>Abbrechen</target>
+
<source>Synchronize</source>
<target>Synchronisieren</target>
@@ -790,7 +811,7 @@ Die Befehlszeile wird ausgelöst, wenn:
<target>Identifiziere und propagiere Änderungen auf beiden Seiten. Löschungen, Verschiebungen und Konflikte werden automatisch mit Hilfe einer Datenbank erkannt.</target>
<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
-<target>Eine Spiegelkopie des linken Ordners erstellen, die dem rechten Ordner genau entspricht.</target>
+<target>Eine Spiegelkopie des linken Ordners erstellen, indem der rechte Ordner angeglichen wird.</target>
<source>Copy new and updated files to the right folder.</source>
<target>Neue und aktualisierte Dateien in den rechten Ordner kopieren.</target>
@@ -898,13 +919,13 @@ Die Befehlszeile wird ausgelöst, wenn:
<target>Fortschrittsdialog zeigen</target>
<source>Save log:</source>
-<target>Log speichern:</target>
+<target>Protokoll speichern:</target>
<source>Limit:</source>
<target>Limit:</target>
<source>Limit maximum number of log files</source>
-<target>Maximale Anzahl der Logdateien begrenzen</target>
+<target>Maximale Anzahl der Protokolldateien begrenzen</target>
<source>How can I schedule a batch job?</source>
<target>Wie können Batch-Aufträge in den Taskplaner eingetragen werden?</target>
@@ -1032,9 +1053,6 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Select Time Span</source>
<target>Zeitspanne auswählen</target>
-<source>Serious Error</source>
-<target>Schwerer Fehler</target>
-
<source>Folder Pairs</source>
<target>Ordnerpaare</target>
@@ -1074,6 +1092,9 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Start synchronization</source>
<target>Synchronisation starten</target>
+<source>Confirm</source>
+<target>Bestätigen</target>
+
<source>
<pluralform>Do you really want to execute the command %y for one item?</pluralform>
<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
@@ -1083,9 +1104,6 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<pluralform>Soll der Befehl %y wirklich für %x Elemente ausgeführt werden?</pluralform>
</target>
-<source>Confirm</source>
-<target>Bestätigen</target>
-
<source>&Execute</source>
<target>&Ausführen</target>
@@ -1179,12 +1197,12 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Do you want to save changes to %x?</source>
<target>Möchten Sie die Änderungen an %x speichern?</target>
-<source>Do&n't save</source>
-<target>&Nicht speichern</target>
-
<source>Never save &changes</source>
<target>Änderungen nie &speichern</target>
+<source>Do&n't save</source>
+<target>&Nicht speichern</target>
+
<source>Filter</source>
<target>Filter</target>
@@ -1266,6 +1284,9 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Warning</source>
<target>Warnung</target>
+<source>Select all</source>
+<target>Alle auswählen</target>
+
<source>Paused</source>
<target>Angehalten</target>
@@ -1389,24 +1410,6 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Percentage</source>
<target>Prozent</target>
-<source>&Ignore subsequent errors</source>
-<target>&Nachfolgende Fehler ignorieren</target>
-
-<source>&Ignore</source>
-<target>&Ignorieren</target>
-
-<source>&Don't show this warning again</source>
-<target>&Diese Warnung nicht mehr anzeigen</target>
-
-<source>&Switch</source>
-<target>&Wechseln</target>
-
-<source>&Yes</source>
-<target>&Ja</target>
-
-<source>&No</source>
-<target>&Nein</target>
-
<source>Cannot monitor directory %x.</source>
<target>Das Verzeichnis %x kann nicht überwacht werden.</target>
diff --git a/BUILD/Languages/greek.lng b/FreeFileSync/Build/Languages/greek.lng
index 4b74807f..176f0409 100644
--- a/BUILD/Languages/greek.lng
+++ b/FreeFileSync/Build/Languages/greek.lng
@@ -7,19 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Και οι δυο πλευρές έχουν αλλάξει από τον τελευταίο συγχρονισμό.</target>
@@ -592,6 +579,9 @@ The command is triggered if:
<source>&Ignore subsequent errors</source>
<target>&Αγνόηση επόμενων σφαλμάτων</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Σοβαρό Σφάλμα</target>
@@ -616,6 +606,9 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Ο αριθμός της τρέχουσας έκδοσης του FreeFileSync δεν βρέθηκε στο δίκτυο. Θέλετε να το ελέγξετε εσείς;</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Συμβολικός δεσμός</target>
@@ -1096,6 +1089,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>Επιβεβαίωση</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Εκτέλεση</target>
diff --git a/BUILD/Languages/hebrew.lng b/FreeFileSync/Build/Languages/hebrew.lng
index 210efe49..1667333d 100644
--- a/BUILD/Languages/hebrew.lng
+++ b/FreeFileSync/Build/Languages/hebrew.lng
@@ -7,16 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>שני הצדדים שונו מאז הסנכרון האחרון.</target>
@@ -80,6 +70,9 @@
<source>Directories cannot be set for more than one configuration file.</source>
<target>מחיצות אינו יכולות להיות מוגדרות עבור יותר מקובץ קונפיגורציה אחד.</target>
+<source>Command line</source>
+<target>שורת פקודות</target>
+
<source>Syntax:</source>
<target>תחביר:</target>
@@ -95,9 +88,6 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>כל כמות של מחיצות אלטרנטיביות עבור לפחות קובץ קונפיגורציה אחד.</target>
-<source>Command line</source>
-<target>שורת פקודות</target>
-
<source>A folder input field is empty.</source>
<target>שדה קלט תיקייה ריק.</target>
@@ -409,18 +399,12 @@ The command is triggered if:
<source>&Start</source>
<target>&התחל</target>
-<source>&Retry</source>
-<target>&נסה שנית</target>
-
-<source>Cancel</source>
-<target>בטל</target>
+<source>About</source>
+<target>אודות</target>
<source>Build: %x</source>
<target>מבנה: %x</target>
-<source>About</source>
-<target>אודות</target>
-
<source>All files</source>
<target>כל הקבצים</target>
@@ -448,6 +432,9 @@ The command is triggered if:
<source>Incorrect command line:</source>
<target>שורת פקודה לא תקינה:</target>
+<source>&Retry</source>
+<target>&נסה שנית</target>
+
<source>File content</source>
<target>תכולת הקובץ</target>
@@ -568,18 +555,43 @@ The command is triggered if:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>ניתן לעבור לחלון הראשי של FreeFileSybc כדי לפתור את הסוגיה הזו.</target>
+<source>&Don't show this warning again</source>
+<target>&לא להראות אזהרה זו שוב</target>
+
+<source>&Ignore</source>
+<target>&התעלם</target>
+
+<source>&Switch</source>
+<target>&החלפה</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>מעבר אל החלון הראשי של FreeFileSybc</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>&התעלם מאזהרות נוספות</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>שגיאה חמורה</target>
+
+<source>Check for Program Updates</source>
+<target>בדוק קיום עדכוני תוכנה</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>גירסה חדשה של FreeFileSync זמינה:</target>
<source>Download now?</source>
<target>הורד עכשיו?</target>
-<source>Check for Program Updates</source>
-<target>בדוק קיום עדכוני תוכנה</target>
-
<source>&Download</source>
<target>&הורד</target>
@@ -592,6 +604,9 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>לא מוצא מספר גירסה עדכנית של FreeFileSync באופן מכוון. האם אתה רוצה לבדוק באופן ידני?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>קשור סימבולי</target>
@@ -721,6 +736,9 @@ The command is triggered if:
<source>Compare</source>
<target>השוואה</target>
+<source>Cancel</source>
+<target>בטל</target>
+
<source>Synchronize</source>
<target>סנכרן</target>
@@ -1066,6 +1084,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Start synchronization</source>
<target>התחל סנכרון</target>
+<source>Confirm</source>
+<target>אשר</target>
+
<source>
<pluralform>Do you really want to execute the command %y for one item?</pluralform>
<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
@@ -1075,9 +1096,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>האם ברצונל לבצע את הפקודה %y עבור %x פריטים?</pluralform>
</target>
-<source>Confirm</source>
-<target>אשר</target>
-
<source>&Execute</source>
<target>&בצע</target>
@@ -1171,12 +1189,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Do you want to save changes to %x?</source>
<target>האם לשמור שינויים אל %x?</target>
-<source>Do&n't save</source>
-<target>אל &תשמור</target>
-
<source>Never save &changes</source>
<target>לא לשמור שינויים ל&עולם</target>
+<source>Do&n't save</source>
+<target>אל &תשמור</target>
+
<source>Filter</source>
<target>מסנן</target>
@@ -1258,9 +1276,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Warning</source>
<target>אזהרה</target>
-<source>Serious Error</source>
-<target>שגיאה חמורה</target>
-
<source>Paused</source>
<target>עצור</target>
@@ -1384,24 +1399,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>אחוז</target>
-<source>&Ignore subsequent errors</source>
-<target>&התעלם מאזהרות נוספות</target>
-
-<source>&Ignore</source>
-<target>&התעלם</target>
-
-<source>&Don't show this warning again</source>
-<target>&לא להראות אזהרה זו שוב</target>
-
-<source>&Switch</source>
-<target>&החלפה</target>
-
-<source>&Yes</source>
-<target>&כן</target>
-
-<source>&No</source>
-<target>&לא</target>
-
<source>Cannot monitor directory %x.</source>
<target>לא יכול לנטר מחיצה %x.</target>
diff --git a/BUILD/Languages/hungarian.lng b/FreeFileSync/Build/Languages/hungarian.lng
index f7057811..a9447de8 100644
--- a/BUILD/Languages/hungarian.lng
+++ b/FreeFileSync/Build/Languages/hungarian.lng
@@ -7,19 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Mindkét oldal megváltozott az utolsó szinkronizálás óta.</target>
@@ -412,12 +399,6 @@ A parancs végrehajtódik, ha:
<source>&Start</source>
<target>&Start</target>
-<source>&Retry</source>
-<target>&Ismét</target>
-
-<source>Cancel</source>
-<target>Mégsem</target>
-
<source>About</source>
<target>A programról</target>
@@ -451,6 +432,9 @@ A parancs végrehajtódik, ha:
<source>Incorrect command line:</source>
<target>Hibás parancssor:</target>
+<source>&Retry</source>
+<target>&Ismét</target>
+
<source>File content</source>
<target>Fájl tartalma</target>
@@ -571,9 +555,34 @@ A parancs végrehajtódik, ha:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>E jelenség megoldásához kapcsoljon át a FreeFileSync fő ablakába.</target>
+<source>&Don't show this warning again</source>
+<target>&Ne mutassa ismételten ezt a figyelmeztetést</target>
+
+<source>&Ignore</source>
+<target>&Kihagy</target>
+
+<source>&Switch</source>
+<target>&Váltás</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Átkapcsolás a FreeFileSync fő ablakába</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>F&igyelmen kívül hagyja az utána következő hibákat</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>Komoly hiba</target>
+
<source>Check for Program Updates</source>
<target>Program-frissítések ellenőrzése</target>
@@ -595,6 +604,9 @@ A parancs végrehajtódik, ha:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Nem lehet online megtalálni a jelenlegi FreeFileSync verziószámot. Meg akarod keresni manuálisan?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Symlink</target>
@@ -724,6 +736,9 @@ A parancs végrehajtódik, ha:
<source>Compare</source>
<target>Összehasonlít</target>
+<source>Cancel</source>
+<target>Mégsem</target>
+
<source>Synchronize</source>
<target>Szinkronizál</target>
@@ -1030,9 +1045,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Select Time Span</source>
<target>Válassza ki az idősávot (időtartamot)</target>
-<source>Serious Error</source>
-<target>Komoly hiba</target>
-
<source>Folder Pairs</source>
<target>Könyvtár-párok</target>
@@ -1084,9 +1096,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<pluralform>Tényleg a végre akarja hajtani a(z) %y parancsot a következő %x elemen?</pluralform>
</target>
-<source>&Don't show this warning again</source>
-<target>&Ne mutassa ismételten ezt a figyelmeztetést</target>
-
<source>&Execute</source>
<target>Vé&grehajt</target>
@@ -1180,12 +1189,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Do you want to save changes to %x?</source>
<target>Akarod menteni a(z) %x változtatásait?</target>
-<source>Do&n't save</source>
-<target>&ne mentse</target>
-
<source>Never save &changes</source>
<target>N&e mentse a változásokat</target>
+<source>Do&n't save</source>
+<target>&ne mentse</target>
+
<source>Filter</source>
<target>Szűrő</target>
@@ -1390,21 +1399,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Percentage</source>
<target>Százalék</target>
-<source>&Ignore subsequent errors</source>
-<target>F&igyelmen kívül hagyja az utána következő hibákat</target>
-
-<source>&Ignore</source>
-<target>&Kihagy</target>
-
-<source>&Switch</source>
-<target>&Váltás</target>
-
-<source>&Yes</source>
-<target>&Igen</target>
-
-<source>&No</source>
-<target>&Nem</target>
-
<source>Cannot monitor directory %x.</source>
<target>Nem sikerült monitorozni a(z) %x könyvtárat.</target>
diff --git a/BUILD/Languages/italian.lng b/FreeFileSync/Build/Languages/italian.lng
index c18c6d30..04b3e5c8 100644
--- a/BUILD/Languages/italian.lng
+++ b/FreeFileSync/Build/Languages/italian.lng
@@ -7,23 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Entrambi i lati sono cambiati dall'ultima sincronizzazione.</target>
@@ -67,7 +50,7 @@
<target>Si è verificata una eccezione</target>
<source>A directory path is expected after %x.</source>
-<target>Un percorso di directory è previsto dopo %x.</target>
+<target>E' previsto un percorso di directory dopo %x.</target>
<source>Syntax error</source>
<target>Errore di sintassi</target>
@@ -75,23 +58,20 @@
<source>Cannot open file %x.</source>
<target>Impossibile aprire il file %x.</target>
-<source>Error</source>
-<target>Errore</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Il file %x non contiene una configurazione valida.</target>
<source>Unequal number of left and right directories specified.</source>
-<target>Numero disuguale di directory sinistra e destra specificate.</target>
+<target>E' stato specificato un numero diverso di directory a sinistra e a destra.</target>
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
-<target>Il file di configurazione non deve contenere le impostazioni a livello di coppia di directory quando le directory sono impostati tramite linea di comando.</target>
-
-<source>Warning</source>
-<target>Attenzione</target>
+<target>Il file di configurazione non deve contenere le impostazioni a livello di coppia di directory quando le directory sono impostate tramite linea di comando.</target>
<source>Directories cannot be set for more than one configuration file.</source>
-<target>Directory non possono essere impostate per più di un file di configurazione.</target>
+<target>Le directory non possono essere impostate per più di un file di configurazione.</target>
+
+<source>Command line</source>
+<target>Linea di comando</target>
<source>Syntax:</source>
<target>Sintassi:</target>
@@ -106,10 +86,7 @@
<target>Qualsiasi numero di FreeFileSync.ffs_gui e/o File di configurazione .ffs_batch.</target>
<source>Any number of alternative directories for at most one config file.</source>
-<target>Qualsiasi numero di directory alternativa per al massimo un file di configurazione.</target>
-
-<source>Command line</source>
-<target>Linea di comando</target>
+<target>Qualsiasi numero di directory alternative per al massimo un file di configurazione.</target>
<source>A folder input field is empty.</source>
<target>Un campo di input cartella è vuoto.</target>
@@ -244,7 +221,7 @@
<target>Impossibile ottenere informazioni sul processo.</target>
<source>Waiting while directory is locked (%x)...</source>
-<target>Attendi mentre la cartella è bloccata (%x)...</target>
+<target>Attendere, la cartella viene bloccata (%x)...</target>
<source>
<pluralform>1 sec</pluralform>
@@ -289,7 +266,7 @@
<target>Errore nel parsing del file %x, riga %y, colonna %z.</target>
<source>Cannot set directory lock for %x.</source>
-<target>Impossibile impostare blocco cartella per %x.</target>
+<target>Impossibile impostare il blocco cartella per %x.</target>
<source>Scanning:</source>
<target>Scansione di:</target>
@@ -422,18 +399,12 @@ Il comando è attivato se:
<source>&Start</source>
<target>&Start</target>
-<source>&Retry</source>
-<target>&Riprova</target>
-
-<source>Cancel</source>
-<target>Annulla</target>
+<source>About</source>
+<target>Info su</target>
<source>Build: %x</source>
<target>Versione: %x</target>
-<source>About</source>
-<target>Info su</target>
-
<source>All files</source>
<target>Tutti i file</target>
@@ -441,10 +412,13 @@ Il comando è attivato se:
<target>Sincronizzazione automatizzata</target>
<source>Directory monitoring active</source>
-<target>Directory di monitoraggio attiva</target>
+<target>Monitoraggio directory attivo</target>
<source>Waiting until all directories are available...</source>
-<target>Aspettare fino a quando sono disponibili tutte le directory...</target>
+<target>Attendere finchè tutte le directory diventano disponibili...</target>
+
+<source>Error</source>
+<target>Errore</target>
<source>&Restore</source>
<target>&Ripristina</target>
@@ -458,6 +432,9 @@ Il comando è attivato se:
<source>Incorrect command line:</source>
<target>Linea di comando non corretta:</target>
+<source>&Retry</source>
+<target>&Riprova</target>
+
<source>File content</source>
<target>Contenuto del file</target>
@@ -578,32 +555,59 @@ Il comando è attivato se:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>È possibile passare alla finestra principale di FreeFileSync per risolvere questo problema.</target>
+<source>&Don't show this warning again</source>
+<target>&Non mostrare più questo avviso</target>
+
+<source>&Ignore</source>
+<target>&Ignora</target>
+
+<source>&Switch</source>
+<target>&Passa a</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Passaggio alla finestra principale di FreeFileSync</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+<pluralform>Riprova Automatica in 1 secondo...</pluralform>
+<pluralform>Riprova Automatica in %x secondi...</pluralform>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>&Ignora errori successivi</target>
+
+<source>Retrying operation...</source>
+<target>Riprovare l'Operazione...</target>
+
+<source>Serious Error</source>
+<target>Errore Grave</target>
+
+<source>Check for Program Updates</source>
+<target>Controlla Aggiornamenti del Programma</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>E' disponibile una nuova versione di FreeFileSync:</target>
<source>Download now?</source>
<target>Scaricarla ora?</target>
-<source>Check for Program Updates</source>
-<target>Controlla Aggiornamenti del Programma</target>
-
<source>&Download</source>
<target>&Scaricare</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync è aggiornato.</target>
-<source>Information</source>
-<target>Informazioni</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Impossibile collegarsi a sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
-<target>Non riesci a trovare l'attuale numero di versione di FreeFileSync on-line . Vuoi controllare manualmente?</target>
+<target>Non riesci a trovare l'attuale numero di versione di FreeFileSync on-line. Vuoi controllare manualmente?</target>
+
+<source>&Check</source>
+<target>&Controllare</target>
<source>Symlink</source>
<target>Symlink</target>
@@ -734,6 +738,9 @@ Il comando è attivato se:
<source>Compare</source>
<target>Compara</target>
+<source>Cancel</source>
+<target>Annulla</target>
+
<source>Synchronize</source>
<target>Sincronizza</target>
@@ -798,10 +805,10 @@ Il comando è attivato se:
<target>Identifica e propaga cambiamenti su entrambi i lati. Cancellazioni, spostamenti e conflitti sono identificati automaticamente usando un database.</target>
<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
-<target>Creare un backup specchio della cartella di sinistra, che corrisponde esattamente alla cartella giusta dopo la sincronizzazione.</target>
+<target>Creare un backup specchio della cartella di sinistra, che corrisponda esattamente alla cartella destra dopo la sincronizzazione.</target>
<source>Copy new and updated files to the right folder.</source>
-<target>Copiare i file nuovi e aggiornati nella cartella giusta.</target>
+<target>Copiare i file nuovi e aggiornati nella cartella destra.</target>
<source>Configure your own synchronization rules.</source>
<target>Configura le tue regole di sincronizzazione.</target>
@@ -825,7 +832,7 @@ Il comando è attivato se:
<target>Cestino</target>
<source>Back up deleted and overwritten files in the recycle bin</source>
-<target>Eseguire il backup di file sovrascritti e cancellati nel cestino</target>
+<target>Eseguire il back up dei file cancellati o sovrascritti nel cestino</target>
<source>Versioning</source>
<target>Versione</target>
@@ -852,7 +859,7 @@ Il comando è attivato se:
<target>Pop-up</target>
<source>Show pop-up on errors or warnings</source>
-<target>Mostra popup di errore o avviso</target>
+<target>Mostra pop-up di errore o avviso</target>
<source>On completion:</source>
<target>Al termine:</target>
@@ -954,7 +961,7 @@ Il comando è attivato se:
<target>Le seguenti impostazioni vengono utilizzate per tutti i processi di sincronizzazione.</target>
<source>Fail-safe file copy</source>
-<target>Copia file di fail-safe</target>
+<target>Copia file a prova di errore</target>
<source>
Copy to a temporary file (*.ffs_tmp) before overwriting target.
@@ -962,7 +969,7 @@ This guarantees a consistent state even in case of a serious error.
</source>
<target>
Copiare in un file temporaneo ( *.ffs_tmp ) prima di sovrascrivere il bersaglio.
-Questo garantisce uno stato costante anche in caso di un errore grave.
+Questo garantisce uno stato consistente anche in caso di errore grave.
</target>
<source>(recommended)</source>
@@ -981,13 +988,13 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Copia permessi di accesso file</target>
<source>Transfer file and folder permissions.</source>
-<target>Trasferimento file e autorizzazioni delle cartelle.</target>
+<target>Trasferimento autorizzazioni di file e cartelle.</target>
<source>Automatic retry on error:</source>
-<target>Tentativo Automaticoin caso di errore:</target>
+<target>Tentativo Automatico in caso di errore:</target>
<source>Retry count:</source>
-<target>Riprova conta:</target>
+<target>Riprova conteggio:</target>
<source>Delay (in seconds):</source>
<target>Ritardo (in secondi):</target>
@@ -1023,10 +1030,10 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Email</target>
<source>Published under the GNU General Public License</source>
-<target>Pubblicato sotto licenza GNU General Public</target>
+<target>Pubblicato con licenza GNU General Public</target>
<source>Many thanks for localization:</source>
-<target>Ringraziamenti per la localizzazione:</target>
+<target>Ringraziamenti per la traduzione:</target>
<source>Save as Batch Job</source>
<target>Salva come Processo Batch</target>
@@ -1082,6 +1089,15 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<source>Confirm</source>
<target>Confermare</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+<pluralform>Vuoi veramente eseguire il comando %y per un elemento?</pluralform>
+<pluralform>Vuoi veramente eseguire il comando %y per %x elementi?</pluralform>
+</target>
+
<source>&Execute</source>
<target>&Esecuzione</target>
@@ -1090,8 +1106,8 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<pluralform>%x directories</pluralform>
</source>
<target>
-<pluralform>1 cartella</pluralform>
-<pluralform>%x cartelle</pluralform>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directory</pluralform>
</target>
<source>
@@ -1108,8 +1124,8 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<pluralform>%y of %x rows in view</pluralform>
</source>
<target>
-<pluralform>%y di 1 riga in vista</pluralform>
-<pluralform>%y di %x righe in vista</pluralform>
+<pluralform>%y di 1 riga nella vista</pluralform>
+<pluralform>%y di %x righe nella vista</pluralform>
</target>
<source>Set direction:</source>
@@ -1155,7 +1171,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Seleziona intervallo di tempo...</target>
<source>Default view</source>
-<target>Vista normale</target>
+<target>Vista predefinita</target>
<source>Show "%x"</source>
<target>Mostra "%x"</target>
@@ -1164,7 +1180,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Ultima sessione</target>
<source>Folder Comparison and Synchronization</source>
-<target>Comparazione di cartelle e sincronizzazione</target>
+<target>Comparazione delle Cartelle e Sincronizzazione</target>
<source>Configuration saved</source>
<target>Configurazione salvata</target>
@@ -1175,12 +1191,12 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<source>Do you want to save changes to %x?</source>
<target>Vuoi salvare le modifiche a %x?</target>
-<source>Do&n't save</source>
-<target>No&n salvare</target>
-
<source>Never save &changes</source>
<target>Non salvare mai &modifiche</target>
+<source>Do&n't save</source>
+<target>No&n salvare</target>
+
<source>Filter</source>
<target>Filtro</target>
@@ -1197,40 +1213,40 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Mostra i file che sono più recenti sulla destra</target>
<source>Show files that are equal</source>
-<target>Mostra file identici</target>
+<target>Mostra i file identici</target>
<source>Show files that are different</source>
-<target>Mostra file differenti</target>
+<target>Mostra i file differenti</target>
<source>Show conflicts</source>
<target>Mostra conflitti</target>
<source>Show files that will be created on the left side</source>
-<target>Mostra file che verranno creati sul lato sinistro</target>
+<target>Mostra i file che verranno creati sul lato sinistro</target>
<source>Show files that will be created on the right side</source>
-<target>Mostra file che verranno creati sul lato destro</target>
+<target>Mostra i file che verranno creati sul lato destro</target>
<source>Show files that will be deleted on the left side</source>
-<target>Mostra file che verranno cancellati sul lato sinistro</target>
+<target>Mostra i file che verranno cancellati sul lato sinistro</target>
<source>Show files that will be deleted on the right side</source>
-<target>Mostra file che verranno cancellati sul lato destro</target>
+<target>Mostra i file che verranno cancellati sul lato destro</target>
<source>Show files that will be overwritten on left side</source>
-<target>Mostra file che verranno sovrascritti sul lato sinistro</target>
+<target>Mostra i file che verranno sovrascritti sul lato sinistro</target>
<source>Show files that will be overwritten on right side</source>
-<target>Mostra file che verranno sovrascritti sul lato destro</target>
+<target>Mostra i file che verranno sovrascritti sul lato destro</target>
<source>Show files that won't be copied</source>
-<target>Mostra file che non saranno copiati</target>
+<target>Mostra i file che non saranno copiati</target>
<source>Set as default</source>
<target>Imposta come predefinito</target>
<source>All folders are in sync</source>
-<target>Tutte le cartelle sono sincronizzate</target>
+<target>Tutte le cartelle risultano sincronizzate</target>
<source>Synchronization Settings</source>
<target>Impostazioni di Sincronizzazione</target>
@@ -1250,36 +1266,18 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<source>Searching for program updates...</source>
<target>Ricerca di aggiornamenti al programma...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Ignora errori successivi</target>
-
-<source>&Ignore</source>
-<target>&Ignora</target>
-
-<source>Serious Error</source>
-<target>Errore Grave</target>
-
-<source>&Don't show this warning again</source>
-<target>&Non mostrare più questo avviso</target>
-
-<source>&Switch</source>
-<target>&Passa</target>
-
-<source>&Yes</source>
-<target>&Si</target>
-
-<source>&No</source>
-<target>&No</target>
-
<source>Scanning...</source>
<target>Scansione...</target>
<source>Comparing content...</source>
-<target>Comparazione contenuto...</target>
+<target>Comparazione del contenuto...</target>
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Attenzione</target>
+
<source>Paused</source>
<target>In pausa</target>
@@ -1339,8 +1337,8 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<pluralform>Do you really want to delete the following %x items?</pluralform>
</source>
<target>
-<pluralform>Vuoi veramente eliminare il seguente oggetto?</pluralform>
-<pluralform>Vuoi veramente eliminare i seguenti %x oggetti?</pluralform>
+<pluralform>Vuoi davvero eliminare il seguente oggetto?</pluralform>
+<pluralform>Vuoi davvero eliminare i seguenti %x oggetti?</pluralform>
</target>
<source>Exclude</source>
@@ -1362,7 +1360,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>- nome completo file o cartella</target>
<source>- folder part only</source>
-<target>- solo porzione cartella</target>
+<target>- solo porzione di cartella</target>
<source>- Other side's counterpart to %item_path%</source>
<target>- Omologo dell'altro lato a %item_path%</target>
@@ -1380,7 +1378,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Sostituisci</target>
<source>Move files and replace if existing</source>
-<target>Sposta file e sostituisci se esistenti</target>
+<target>Sposta i file e sostituisci se esistenti</target>
<source>Time stamp</source>
<target>Data e ora</target>
@@ -1422,7 +1420,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Impossibile eliminare la cartella %x.</target>
<source>Cannot write file attributes of %x.</source>
-<target>Impossibile scrivere attributi file di %x.</target>
+<target>Impossibile scrivere gli attributi del file %x.</target>
<source>Cannot write modification time of %x.</source>
<target>Impossibile scrivere data e ora di modifica di %x.</target>
@@ -1440,7 +1438,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Impossibile scrivere i permessi di %x.</target>
<source>Cannot create directory %x.</source>
-<target>Impossibile creare cartella %x.</target>
+<target>Impossibile creare la cartella %x.</target>
<source>Cannot create symbolic link %x.</source>
<target>Impossibile creare il collegamento %x.</target>
@@ -1449,7 +1447,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Impossibile trovare la funzione di sistema %x.</target>
<source>Cannot copy file %x to %y.</source>
-<target>Impossibile copiare file %x in %y.</target>
+<target>Impossibile copiare il file %x in %y.</target>
<source>Type of item %x is not supported:</source>
<target>Il tipo di oggetto %x non è supportato:</target>
@@ -1458,10 +1456,10 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Impossibile risolvere collegamento %x.</target>
<source>Cannot open directory %x.</source>
-<target>Impossibile aprire cartella %x.</target>
+<target>Impossibile aprire la cartella %x.</target>
<source>Cannot enumerate directory %x.</source>
-<target>Impossibile numerare cartella %x.</target>
+<target>Impossibile enumerare la cartella %x.</target>
<source>%x TB</source>
<target>%x TB</target>
@@ -1503,7 +1501,7 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Impossibile impostare privilegi %x.</target>
<source>Unable to suspend system sleep mode.</source>
-<target>Impossibile sospendere la modalità di sonno del sistema.</target>
+<target>Impossibile interrompere la modalità di sospensione del sistema.</target>
<source>Cannot change process I/O priorities.</source>
<target>Impossibile modificare le priorità I/O del processo.</target>
@@ -1515,5 +1513,5 @@ Questo garantisce uno stato costante anche in caso di un errore grave.
<target>Impossibile determinare il percorso finale per %x.</target>
<source>Error Code %x:</source>
-<target>Errore Codice %x:</target>
+<target>Codice Errore %x:</target>
diff --git a/BUILD/Languages/japanese.lng b/FreeFileSync/Build/Languages/japanese.lng
index d47a75fc..f32e722b 100644
--- a/BUILD/Languages/japanese.lng
+++ b/FreeFileSync/Build/Languages/japanese.lng
@@ -7,23 +7,6 @@
<plural_definition>0</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>前回最後の同期処理以降、両側とも変更があります.</target>
@@ -75,9 +58,6 @@
<source>Cannot open file %x.</source>
<target>ファイル %x を開けません</target>
-<source>Error</source>
-<target>エラー</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>ファイル %x には有効な構成が含まれていません.</target>
@@ -87,12 +67,12 @@
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>コマンドライン経由でディレクトリが設定されている時は、構成設定にペア・レベルのディレクトリは含められません.</target>
-<source>Warning</source>
-<target>警告</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>構成設定ファイルにひとつ以上のディレクトリは設定できません.</target>
+<source>Command line</source>
+<target>コマンドライン</target>
+
<source>Syntax:</source>
<target>構文:</target>
@@ -108,9 +88,6 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>ひとつの構成設定ファイルに対して任意の数の代替ディレクトリ.</target>
-<source>Command line</source>
-<target>コマンドライン</target>
-
<source>A folder input field is empty.</source>
<target>フォルダ入力欄が空白です.</target>
@@ -419,18 +396,12 @@ The command is triggered if:
<source>&Start</source>
<target>開始(&S)</target>
-<source>&Retry</source>
-<target>再試行(&R)</target>
-
-<source>Cancel</source>
-<target>キャンセル</target>
+<source>About</source>
+<target>情報</target>
<source>Build: %x</source>
<target>ビルド: %x</target>
-<source>About</source>
-<target>情報</target>
-
<source>All files</source>
<target>すべてのファイル</target>
@@ -443,6 +414,9 @@ The command is triggered if:
<source>Waiting until all directories are available...</source>
<target>全ディレクトリが利用可能になるまで待機中...</target>
+<source>Error</source>
+<target>エラー</target>
+
<source>&Restore</source>
<target>修復(&R)</target>
@@ -455,6 +429,9 @@ The command is triggered if:
<source>Incorrect command line:</source>
<target>不正なコマンドライン:</target>
+<source>&Retry</source>
+<target>再試行(&R)</target>
+
<source>File content</source>
<target>ファイルの内容</target>
@@ -575,33 +552,58 @@ The command is triggered if:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>FreeFileSync のメインウィンドウを切り替えることでこの問題を解決</target>
+<source>&Don't show this warning again</source>
+<target>次回からこの警告を表示しない(&D)</target>
+
+<source>&Ignore</source>
+<target>無視(&I)</target>
+
+<source>&Switch</source>
+<target>切り替え(&S)</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>FreeFileSync メインウィンドウの切り替え</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>以降のエラーは無視する(&I)</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>重大なエラー</target>
+
+<source>Check for Program Updates</source>
+<target>プログラムのアップデートを確認</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>FreeFileSync の新しいバージョンが利用できます:</target>
<source>Download now?</source>
<target>ダウンロードしますか?</target>
-<source>Check for Program Updates</source>
-<target>プログラムのアップデートを確認</target>
-
<source>&Download</source>
<target>ダウンロード(&D)</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync は最新です.</target>
-<source>Information</source>
-<target>インフォメーション</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Sourceforge.net に接続できません.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>現在の FreeFileSync バージョン番号を確認できませんでした、手動で確認しますか?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>シンボリックリンク</target>
@@ -731,6 +733,9 @@ The command is triggered if:
<source>Compare</source>
<target>比較</target>
+<source>Cancel</source>
+<target>キャンセル</target>
+
<source>Synchronize</source>
<target>同期処理</target>
@@ -1079,6 +1084,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>確認</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>実行(&E)</target>
@@ -1169,12 +1181,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Do you want to save changes to %x?</source>
<target>本当に %x の変更を保存しますか?</target>
-<source>Do&n't save</source>
-<target>保存しない(&N)</target>
-
<source>Never save &changes</source>
<target>変更の保存をしない(&C)</target>
+<source>Do&n't save</source>
+<target>保存しない(&N)</target>
+
<source>Filter</source>
<target>フィルター</target>
@@ -1244,27 +1256,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Searching for program updates...</source>
<target>アップデートを検索しています...</target>
-<source>&Ignore subsequent errors</source>
-<target>以降のエラーは無視する(&I)</target>
-
-<source>&Ignore</source>
-<target>無視(&I)</target>
-
-<source>Serious Error</source>
-<target>重大なエラー</target>
-
-<source>&Don't show this warning again</source>
-<target>次回からこの警告を表示しない(&D)</target>
-
-<source>&Switch</source>
-<target>切り替え(&S)</target>
-
-<source>&Yes</source>
-<target>はい(&Y)</target>
-
-<source>&No</source>
-<target>いいえ(&N)</target>
-
<source>Scanning...</source>
<target>スキャン中...</target>
@@ -1274,6 +1265,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>情報</target>
+<source>Warning</source>
+<target>警告</target>
+
<source>Paused</source>
<target>一時停止中</target>
diff --git a/BUILD/Languages/korean.lng b/FreeFileSync/Build/Languages/korean.lng
index 0caaf5a4..999dc5b1 100644
--- a/BUILD/Languages/korean.lng
+++ b/FreeFileSync/Build/Languages/korean.lng
@@ -7,12 +7,6 @@
<plural_definition>0</plural_definition>
</header>
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>마지막 동기화 작업 이후, 양측 모두 변경 되었습니다.</target>
@@ -402,12 +396,6 @@ The command is triggered if:
<source>&Start</source>
<target>시작(&S)</target>
-<source>&Retry</source>
-<target>다시 시도(&R)</target>
-
-<source>Cancel</source>
-<target>취소</target>
-
<source>About</source>
<target>상세 정보</target>
@@ -441,6 +429,9 @@ The command is triggered if:
<source>Incorrect command line:</source>
<target>부정확한 명령줄:</target>
+<source>&Retry</source>
+<target>다시 시도(&R)</target>
+
<source>File content</source>
<target>파일 내용</target>
@@ -581,12 +572,15 @@ The command is triggered if:
<pluralform>%x초 이내에 자동 재시도...</pluralform>
</target>
-<source>Serious Error</source>
-<target>심각한 오류</target>
-
<source>&Ignore subsequent errors</source>
<target>이후 오류 무시(&I)</target>
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>심각한 오류</target>
+
<source>Check for Program Updates</source>
<target>프로그램 업데이트 확인</target>
@@ -608,6 +602,9 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>현재 사용 중인 FreeFileSync 버전 번호를 온라인에서 찾을 수 없습니다. 수동으로 확인해 보시겠습니까?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>심링크</target>
@@ -737,6 +734,9 @@ The command is triggered if:
<source>Compare</source>
<target>비 교</target>
+<source>Cancel</source>
+<target>취소</target>
+
<source>Synchronize</source>
<target>동 기 화</target>
@@ -824,8 +824,8 @@ The command is triggered if:
<source>Delete or overwrite files permanently</source>
<target>파일 영구 삭제 또는 덮어쓰기</target>
-<source>&Recycle bin</source>
-<target>휴지통(&R)</target>
+<source>Recycle bin</source>
+<target></target>
<source>Back up deleted and overwritten files in the recycle bin</source>
<target>휴지통에 삭제되고 덮어 씌어진 파일 백업</target>
@@ -920,6 +920,9 @@ The command is triggered if:
<source>How can I schedule a batch job?</source>
<target>일괄 작업 예약 방법은?</target>
+<source>&Recycle bin</source>
+<target>휴지통(&R)</target>
+
<source>Delete on both sides</source>
<target>양측 모두 삭제</target>
diff --git a/BUILD/Languages/outdated/lithuanian.lng b/FreeFileSync/Build/Languages/outdated/lithuanian.lng
index d503fa7e..f4c49c2a 100644
--- a/BUILD/Languages/outdated/lithuanian.lng
+++ b/FreeFileSync/Build/Languages/outdated/lithuanian.lng
@@ -1,320 +1,12 @@
<header>
<language>Lietuvių</language>
- <translator>Tadas Norbutas</translator>
+ <translator>xxx</translator>
<locale>lt_LT</locale>
<image>flag_lithuania.png</image>
<plural_count>4</plural_count>
<plural_definition>n==1 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3</plural_definition>
</header>
-<source>Unable to suspend system sleep mode.</source>
-<target></target>
-
-<source>Unable to register to receive system messages.</source>
-<target></target>
-
-<source>Restore all hidden windows and warnings?</source>
-<target></target>
-
-<source>Move</source>
-<target></target>
-
-<source>&Continue</source>
-<target></target>
-
-<source>Stopped</source>
-<target></target>
-
-<source>&Don't show this warning again</source>
-<target></target>
-
-<source>Serious Error</source>
-<target></target>
-
-<source>&Ignore subsequent errors</source>
-<target></target>
-
-<source>Comparison Settings</source>
-<target></target>
-
-<source>Synchronization Settings</source>
-<target></target>
-
-<source>Never save &changes</source>
-<target></target>
-
-<source>
-<pluralform>%y of 1 row in view</pluralform>
-<pluralform>%y of %x rows in view</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Execute</source>
-<target></target>
-
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Select View</source>
-<target></target>
-
-<source>Filter Files</source>
-<target></target>
-
-<source>Main Bar</source>
-<target></target>
-
-<source>Folder Pairs</source>
-<target></target>
-
-<source>Select Time Span</source>
-<target></target>
-
-<source>Global Settings</source>
-<target></target>
-
-<source>Delete Items</source>
-<target></target>
-
-<source>Save as Batch Job</source>
-<target></target>
-
-<source>Restore hidden windows</source>
-<target></target>
-
-<source>Customize context menu:</source>
-<target></target>
-
-<source>Delay (in seconds):</source>
-<target></target>
-
-<source>Retry count:</source>
-<target></target>
-
-<source>Automatic retry on error:</source>
-<target></target>
-
-<source>Transfer file and folder permissions.</source>
-<target></target>
-
-<source>(requires administrator rights)</source>
-<target></target>
-
-<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target></target>
-
-<source>(recommended)</source>
-<target></target>
-
-<source>
-Copy to a temporary file (*.ffs_tmp) before overwriting target.
-This guarantees a consistent state even in case of a serious error.
-</source>
-<target></target>
-
-<source>The following settings are used for all synchronization jobs.</source>
-<target></target>
-
-<source>Maximum:</source>
-<target></target>
-
-<source>Minimum:</source>
-<target></target>
-
-<source>File size:</source>
-<target></target>
-
-<source>Time span:</source>
-<target></target>
-
-<source>Exclude:</source>
-<target></target>
-
-<source>Include:</source>
-<target></target>
-
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target></target>
-
-<source>&Recycle bin</source>
-<target></target>
-
-<source>How can I schedule a batch job?</source>
-<target></target>
-
-<source>Limit:</source>
-<target></target>
-
-<source>Save log:</source>
-<target></target>
-
-<source>Stop synchronization at first error</source>
-<target></target>
-
-<source>Stop</source>
-<target></target>
-
-<source>&Don't show this dialog again</source>
-<target></target>
-
-<source>Variant:</source>
-<target></target>
-
-<source>Start synchronization now?</source>
-<target></target>
-
-<source>On completion:</source>
-<target></target>
-
-<source>Handle errors:</source>
-<target></target>
-
-<source>Show examples</source>
-<target></target>
-
-<source>Delete files:</source>
-<target></target>
-
-<source>Copy new and updated files to the right folder.</source>
-<target></target>
-
-<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
-<target></target>
-
-<source>More information</source>
-<target></target>
-
-<source>Symbolic links:</source>
-<target></target>
-
-<source>Identify equal files by comparing the file content.</source>
-<target></target>
-
-<source>Identify equal files by comparing modification time and size.</source>
-<target></target>
-
-<source>Select a variant:</source>
-<target></target>
-
-<source>Find:</source>
-<target></target>
-
-<source>Close search bar</source>
-<target></target>
-
-<source>&Check for new version</source>
-<target></target>
-
-<source>&Tools</source>
-<target></target>
-
-<source>&Find...</source>
-<target></target>
-
-<source>Local Filter</source>
-<target></target>
-
-<source>Alternate Synchronization Settings</source>
-<target></target>
-
-<source>Alternate Comparison Settings</source>
-<target></target>
-
-<source>None</source>
-<target></target>
-
-<source>Active</source>
-<target></target>
-
-<source>Local filter</source>
-<target></target>
-
-<source>Alternate synchronization settings</source>
-<target></target>
-
-<source>Alternate comparison settings</source>
-<target></target>
-
-<source>&Download</source>
-<target></target>
-
-<source>Check for Program Updates</source>
-<target></target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
-<source>Switching to FreeFileSync's main window</source>
-<target></target>
-
-<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target></target>
-
-<source>Synchronization stopped</source>
-<target></target>
-
-<source>Please enter a target folder for versioning.</source>
-<target></target>
-
-<source>Incorrect command line:</source>
-<target></target>
-
-<source>&Show error</source>
-<target></target>
-
-<source>Automated Synchronization</source>
-<target></target>
-
-<source>&Start</source>
-<target></target>
-
-<source>Command line:</source>
-<target></target>
-
-<source>Idle time (in seconds):</source>
-<target></target>
-
-<source>Folders to watch:</source>
-<target></target>
-
-<source>&View help</source>
-<target></target>
-
-<source>Unable to create timestamp for versioning:</source>
-<target></target>
-
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target></target>
-
-<source>%x items/sec</source>
-<target></target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-</target>
-
-<source>
-<pluralform>1 byte</pluralform>
-<pluralform>%x bytes</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Abi pusės buvo pakeistos nuo paskutinio sinchronizavimo.</target>
@@ -366,9 +58,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot open file %x.</source>
<target>%x failo nepavyko atidaryti.</target>
-<source>Error</source>
-<target>Klaida</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Failas %x neturi tinkamų nustatymų.</target>
@@ -378,12 +67,12 @@ This guarantees a consistent state even in case of a serious error.
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Config failas negali turėti katalogų poros lygio nustatymų kai katalogai nustatomi per komandinę eilutę.</target>
-<source>Warning</source>
-<target>Perspėjimas</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Katalogai negali būti nustatyti daugiau nei viename konfigūracijos faile.</target>
+<source>Command line</source>
+<target>Komandinė eilutė</target>
+
<source>Syntax:</source>
<target>Sintaksė:</target>
@@ -399,9 +88,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Any number of alternative directories for at most one config file.</source>
<target>Daugiausia vienam config failui, n alternatyvių katalogų</target>
-<source>Command line</source>
-<target>Komandinė eilutė</target>
-
<source>A folder input field is empty.</source>
<target>Aplanko įvesties laukas yra tuščias.</target>
@@ -560,6 +246,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Total time:</source>
<target>Visas laikas:</target>
+<source>
+<pluralform>1 byte</pluralform>
+<pluralform>%x bytes</pluralform>
+</source>
+<target>
+</target>
+
<source>%x MB</source>
<target>%x MB</target>
@@ -578,12 +271,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Scanning:</source>
<target>Skenuojama:</target>
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+</target>
+
<source>Encoding extended time information: %x</source>
<target>Koduojama išplėstinė laiko informacija: %x</target>
<source>/sec</source>
<target>/sek.</target>
+<source>%x items/sec</source>
+<target></target>
+
<source>Configuration file %x loaded partially only.</source>
<target>Nustatymų failas %x įkeltas tik dalinai.</target>
@@ -611,6 +314,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Volume name %x is not part of file path %y.</source>
<target>Vietos vardas %x nėra failo kelio %y dalis.</target>
+<source>Stop requested: Waiting for current operation to finish...</source>
+<target></target>
+
+<source>Unable to create timestamp for versioning:</source>
+<target></target>
+
<source>Cannot read the following XML elements:</source>
<target>Nepavyksta perskaityti sekančių XML elementų:</target>
@@ -626,6 +335,9 @@ This guarantees a consistent state even in case of a serious error.
<source>&Program</source>
<target>&Programa</target>
+<source>&View help</source>
+<target></target>
+
<source>&About</source>
<target>&Apie</target>
@@ -647,6 +359,9 @@ This guarantees a consistent state even in case of a serious error.
<source>To get started just import a .ffs_batch file.</source>
<target>Kad pradėti tiesiog importuokite .ffs_batch failą.</target>
+<source>Folders to watch:</source>
+<target></target>
+
<source>Add folder</source>
<target>Pridėti aplanką</target>
@@ -659,9 +374,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Select a folder</source>
<target>Pažymėti aplanką</target>
+<source>Idle time (in seconds):</source>
+<target></target>
+
<source>Idle time between last detected change and execution of command</source>
<target>Neveiklus laikas tarp paskutinio aptikto pokyčio ir komandos įvykdymo</target>
+<source>Command line:</source>
+<target></target>
+
<source>
The command is triggered if:
- files or subfolders change
@@ -673,33 +394,45 @@ Komanda inicijuojama jei:
- atsiranda nauji aplankai (pvz.: įkišamas USB raktas)
</target>
-<source>&Retry</source>
-<target>&Bandyti vėl</target>
+<source>&Start</source>
+<target></target>
-<source>Cancel</source>
-<target>Atšaukti</target>
+<source>About</source>
+<target>Apie</target>
<source>Build: %x</source>
<target>Versija: %x</target>
-<source>About</source>
-<target>Apie</target>
-
<source>All files</source>
<target>Visi failai</target>
+<source>Automated Synchronization</source>
+<target></target>
+
<source>Directory monitoring active</source>
<target>Katalogų stebėjimas yra aktyvus</target>
<source>Waiting until all directories are available...</source>
<target>Laukiama kol katalogai bus prieinami...</target>
+<source>Error</source>
+<target>Klaida</target>
+
<source>&Restore</source>
<target>&Atstatyti</target>
+<source>&Show error</source>
+<target></target>
+
<source>&Exit</source>
<target>&Išeiti</target>
+<source>Incorrect command line:</source>
+<target></target>
+
+<source>&Retry</source>
+<target>&Bandyti vėl</target>
+
<source>File content</source>
<target>Failo turinį</target>
@@ -760,6 +493,9 @@ Komanda inicijuojama jei:
<source>Target folder input field must not be empty.</source>
<target>Tikslo aplanko įvesties laukas negali būti tuščias.</target>
+<source>Please enter a target folder for versioning.</source>
+<target></target>
+
<source>Source folder %x not found.</source>
<target>Šaltinio aplankas %x nerastas.</target>
@@ -796,6 +532,9 @@ Komanda inicijuojama jei:
<source>job name</source>
<target>Užduoties pavadinimas</target>
+<source>Synchronization stopped</source>
+<target></target>
+
<source>Synchronization completed with errors</source>
<target>Synchronizavimas baigtas su klaidomis</target>
@@ -811,24 +550,61 @@ Komanda inicijuojama jei:
<source>Saving log file %x...</source>
<target>Saugmas žurnalo failas %x...</target>
+<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
+<target></target>
+
+<source>&Don't show this warning again</source>
+<target></target>
+
+<source>&Ignore</source>
+<target>&Ignoruoti</target>
+
+<source>&Switch</source>
+<target>&Perjungti</target>
+
+<source>Switching to FreeFileSync's main window</source>
+<target></target>
+
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target></target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target></target>
+
+<source>Check for Program Updates</source>
+<target></target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Yra nauja FreeFileSync versija:</target>
<source>Download now?</source>
<target>Atsiųsti dabar?</target>
+<source>&Download</source>
+<target></target>
+
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync yra naujausia.</target>
-<source>Information</source>
-<target>Informacija</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Nepavyksta prisijungti prie sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Dabartinės FreeFileSync versijos numeris internete nerastas. Ar norėtumėte patikrinti rankiniu būdu?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Simbolinė nuoroda</target>
@@ -880,6 +656,21 @@ Komanda inicijuojama jei:
<source>Hibernate</source>
<target>Stabdyti į operatyviąją atmintį</target>
+<source>Alternate comparison settings</source>
+<target></target>
+
+<source>Alternate synchronization settings</source>
+<target></target>
+
+<source>Local filter</source>
+<target></target>
+
+<source>Active</source>
+<target></target>
+
+<source>None</source>
+<target></target>
+
<source>Remove alternate settings</source>
<target>Pašalinti alternatyvius nustatymus</target>
@@ -892,6 +683,15 @@ Komanda inicijuojama jei:
<source>Paste</source>
<target>Įklijuoti</target>
+<source>Alternate Comparison Settings</source>
+<target></target>
+
+<source>Alternate Synchronization Settings</source>
+<target></target>
+
+<source>Local Filter</source>
+<target></target>
+
<source>&New</source>
<target>&Naujas</target>
@@ -913,18 +713,30 @@ Komanda inicijuojama jei:
<source>&Language</source>
<target>&Kalba</target>
+<source>&Find...</source>
+<target></target>
+
<source>&Export file list...</source>
<target>&Eksportuoti failų sąrašą...</target>
+<source>&Tools</source>
+<target></target>
+
<source>&Check now</source>
<target>&Tikrinti dabar</target>
<source>Check &automatically once a week</source>
<target>Tikrinti &automatiškai kartą per savaitę</target>
+<source>&Check for new version</source>
+<target></target>
+
<source>Compare</source>
<target>Sulyginti</target>
+<source>Cancel</source>
+<target>Atšaukti</target>
+
<source>Synchronize</source>
<target>Sinchronizuoti</target>
@@ -937,6 +749,12 @@ Komanda inicijuojama jei:
<source>Swap sides</source>
<target>Sukeisti puses</target>
+<source>Close search bar</source>
+<target></target>
+
+<source>Find:</source>
+<target></target>
+
<source>Match case</source>
<target>Atitikti atveją</target>
@@ -961,12 +779,33 @@ Komanda inicijuojama jei:
<source>Total bytes to copy</source>
<target>Viso baitų kopijuoti</target>
+<source>Select a variant:</source>
+<target></target>
+
+<source>Identify equal files by comparing modification time and size.</source>
+<target></target>
+
+<source>Identify equal files by comparing the file content.</source>
+<target></target>
+
+<source>Symbolic links:</source>
+<target></target>
+
+<source>More information</source>
+<target></target>
+
<source>OK</source>
<target>Gerai</target>
<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
<target>Nustatyti ir skatinti pokyčius apbiejose pusėse. Trinimai, perkėlimai ir konfliktai yra aptinkami automatiškai naudojant duomenų bazę.</target>
+<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
+<target></target>
+
+<source>Copy new and updated files to the right folder.</source>
+<target></target>
+
<source>Configure your own synchronization rules.</source>
<target>Nustatyti Jūsų pačių sinchronizavimo taisykles.</target>
@@ -976,6 +815,9 @@ Komanda inicijuojama jei:
<source>Requires database files. Not supported by all file systems.</source>
<target>Reikalauja duomenų bazės failų. Visų failų sistemų nėra palaikoma.</target>
+<source>Delete files:</source>
+<target></target>
+
<source>Permanent</source>
<target>Visiškai</target>
@@ -997,6 +839,12 @@ Komanda inicijuojama jei:
<source>Naming convention:</source>
<target>Pavadinimų taisyklės:</target>
+<source>Show examples</source>
+<target></target>
+
+<source>Handle errors:</source>
+<target></target>
+
<source>Ignore</source>
<target>Ignoruoti</target>
@@ -1009,9 +857,21 @@ Komanda inicijuojama jei:
<source>Show pop-up on errors or warnings</source>
<target>Rodyti pranešimą esant klaidoms ar perspėjimams</target>
+<source>On completion:</source>
+<target></target>
+
+<source>Start synchronization now?</source>
+<target></target>
+
+<source>Variant:</source>
+<target></target>
+
<source>Statistics</source>
<target>Statistika</target>
+<source>&Don't show this dialog again</source>
+<target></target>
+
<source>Items found:</source>
<target>Rasta elementų:</target>
@@ -1036,36 +896,111 @@ Komanda inicijuojama jei:
<source>&Pause</source>
<target>&Pauzė</target>
+<source>Stop</source>
+<target></target>
+
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Sukurti paleidimo failą sinchronizacijai be priežiūros. Norint jį paleisti reikia paspausti and failo du kartus pele arba nustatyti su užduočių planuotoju: %x</target>
+<source>Stop synchronization at first error</source>
+<target></target>
+
<source>Show progress dialog</source>
<target>Rodyti eigos langą</target>
+<source>Save log:</source>
+<target></target>
+
+<source>Limit:</source>
+<target></target>
+
<source>Limit maximum number of log files</source>
<target>Apriboti ataskaitų failų skaičių</target>
+<source>How can I schedule a batch job?</source>
+<target></target>
+
+<source>&Recycle bin</source>
+<target></target>
+
<source>Delete on both sides</source>
<target>Ištrinti abiejose pusėse</target>
<source>Delete on both sides even if the file is selected on one side only</source>
<target>Ištrinti abiejose pusėse net jei failas yra pažymėtas tik vienoje pusėje</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target></target>
+
+<source>Include:</source>
+<target></target>
+
+<source>Exclude:</source>
+<target></target>
+
+<source>Time span:</source>
+<target></target>
+
+<source>File size:</source>
+<target></target>
+
+<source>Minimum:</source>
+<target></target>
+
+<source>Maximum:</source>
+<target></target>
+
<source>&Clear</source>
<target>&Išvalyti</target>
+<source>The following settings are used for all synchronization jobs.</source>
+<target></target>
+
<source>Fail-safe file copy</source>
<target>Apsauginė failo kopija</target>
+<source>
+Copy to a temporary file (*.ffs_tmp) before overwriting target.
+This guarantees a consistent state even in case of a serious error.
+</source>
+<target></target>
+
+<source>(recommended)</source>
+<target></target>
+
<source>Copy locked files</source>
<target>Kopijuoti užrakintus failus</target>
+<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
+<target></target>
+
+<source>(requires administrator rights)</source>
+<target></target>
+
<source>Copy file access permissions</source>
<target>Kopijuoti failo leidimus</target>
+<source>Transfer file and folder permissions.</source>
+<target></target>
+
+<source>Automatic retry on error:</source>
+<target></target>
+
+<source>Retry count:</source>
+<target></target>
+
+<source>Delay (in seconds):</source>
+<target></target>
+
+<source>Customize context menu:</source>
+<target></target>
+
<source>Description</source>
<target>Apibūdinimas</target>
+<source>Restore hidden windows</source>
+<target></target>
+
<source>&Default</source>
<target>&Numatyta</target>
@@ -1093,6 +1028,21 @@ Komanda inicijuojama jei:
<source>Many thanks for localization:</source>
<target>Labai dėkojame už vertimą:</target>
+<source>Save as Batch Job</source>
+<target></target>
+
+<source>Delete Items</source>
+<target></target>
+
+<source>Global Settings</source>
+<target></target>
+
+<source>Select Time Span</source>
+<target></target>
+
+<source>Folder Pairs</source>
+<target></target>
+
<source>Find</source>
<target>Rasti</target>
@@ -1102,6 +1052,15 @@ Komanda inicijuojama jei:
<source>Configuration</source>
<target>Nustatymai</target>
+<source>Main Bar</source>
+<target></target>
+
+<source>Filter Files</source>
+<target></target>
+
+<source>Select View</source>
+<target></target>
+
<source>Open...</source>
<target>Atverti...</target>
@@ -1124,6 +1083,16 @@ Komanda inicijuojama jei:
<target>Patvirtinti</target>
<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Execute</source>
+<target></target>
+
+<source>
<pluralform>1 directory</pluralform>
<pluralform>%x directories</pluralform>
</source>
@@ -1145,6 +1114,13 @@ Komanda inicijuojama jei:
<pluralform>%x failas</pluralform>
</target>
+<source>
+<pluralform>%y of 1 row in view</pluralform>
+<pluralform>%y of %x rows in view</pluralform>
+</source>
+<target>
+</target>
+
<source>Set direction:</source>
<target>Nustatyti kryptį:</target>
@@ -1208,6 +1184,9 @@ Komanda inicijuojama jei:
<source>Do you want to save changes to %x?</source>
<target>Ar norite išsaugoti %x pakeitimus?</target>
+<source>Never save &changes</source>
+<target></target>
+
<source>Do&n't save</source>
<target>&Nesaugoti</target>
@@ -1262,6 +1241,12 @@ Komanda inicijuojama jei:
<source>All folders are in sync</source>
<target>Visi aplankai susinchronizuoti</target>
+<source>Synchronization Settings</source>
+<target></target>
+
+<source>Comparison Settings</source>
+<target></target>
+
<source>Cannot find %x</source>
<target>Nepavyksta rasti %x</target>
@@ -1274,18 +1259,6 @@ Komanda inicijuojama jei:
<source>Searching for program updates...</source>
<target>Ieškoma programos atnaujinimų...</target>
-<source>&Ignore</source>
-<target>&Ignoruoti</target>
-
-<source>&Switch</source>
-<target>&Perjungti</target>
-
-<source>&Yes</source>
-<target>&Taip</target>
-
-<source>&No</source>
-<target>&Ne</target>
-
<source>Scanning...</source>
<target>Skenuojama...</target>
@@ -1295,15 +1268,24 @@ Komanda inicijuojama jei:
<source>Info</source>
<target>Informacija</target>
+<source>Warning</source>
+<target>Perspėjimas</target>
+
<source>Paused</source>
<target>Pristabdyta</target>
<source>Initializing...</source>
<target>Pradedama...</target>
+<source>Stopped</source>
+<target></target>
+
<source>Completed</source>
<target>Baigta</target>
+<source>&Continue</source>
+<target></target>
+
<source>Log</source>
<target>Archyvas</target>
@@ -1342,6 +1324,9 @@ Komanda inicijuojama jei:
<pluralform>Ar tikrai norite perkelti poziciją %x į šiukšklių dėžę?</pluralform>
</target>
+<source>Move</source>
+<target></target>
+
<source>
<pluralform>Do you really want to delete the following item?</pluralform>
<pluralform>Do you really want to delete the following %x items?</pluralform>
@@ -1380,6 +1365,9 @@ Komanda inicijuojama jei:
<source>- Other side's counterpart to %item_folder%</source>
<target>- Kitos pusės atitikmuo %item_folder%</target>
+<source>Restore all hidden windows and warnings?</source>
+<target></target>
+
<source>Leave as unresolved conflict</source>
<target>Palikti kaip neišpręstą konfliktą</target>
@@ -1509,9 +1497,15 @@ Komanda inicijuojama jei:
<pluralform>%x diena</pluralform>
</target>
+<source>Unable to register to receive system messages.</source>
+<target></target>
+
<source>Cannot set privilege %x.</source>
<target>Nepavyksta nustatyti privilegijos %x.</target>
+<source>Unable to suspend system sleep mode.</source>
+<target></target>
+
<source>Cannot change process I/O priorities.</source>
<target>Nepavyksta pakeisti proceso I/O prioritetų.</target>
diff --git a/BUILD/Languages/outdated/norwegian.lng b/FreeFileSync/Build/Languages/outdated/norwegian.lng
index e965718f..86192770 100644
--- a/BUILD/Languages/outdated/norwegian.lng
+++ b/FreeFileSync/Build/Languages/outdated/norwegian.lng
@@ -1,544 +1,108 @@
<header>
<language>Norsk</language>
- <translator>Bjørn Snoen</translator>
+ <translator>xxx</translator>
<locale>nb_NO</locale>
<image>flag_norway.png</image>
<plural_count>2</plural_count>
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Cannot determine final path for %x.</source>
-<target></target>
-
-<source>Unable to move %x to the recycle bin.</source>
-<target></target>
-
-<source>Unable to suspend system sleep mode.</source>
-<target></target>
-
-<source>Unable to register to receive system messages.</source>
-<target></target>
-
-<source>Cannot create symbolic link %x.</source>
-<target></target>
-
-<source>Items</source>
-<target></target>
-
-<source>Time stamp</source>
-<target></target>
-
-<source>Restore all hidden windows and warnings?</source>
-<target></target>
-
-<source>
-<pluralform>Do you really want to delete the following item?</pluralform>
-<pluralform>Do you really want to delete the following %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Move</source>
-<target></target>
-
-<source>
-<pluralform>Do you really want to move the following item to the recycle bin?</pluralform>
-<pluralform>Do you really want to move the following %x items to the recycle bin?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Log</source>
-<target></target>
-
-<source>&Continue</source>
-<target></target>
-
-<source>Stopped</source>
-<target></target>
-
-<source>&Don't show this warning again</source>
-<target></target>
-
-<source>Serious Error</source>
-<target></target>
-
-<source>&Ignore subsequent errors</source>
-<target></target>
-
-<source>Searching for program updates...</source>
-<target></target>
-
-<source>Comma-separated values</source>
-<target></target>
-
-<source>Comparison Settings</source>
-<target></target>
-
-<source>Synchronization Settings</source>
-<target></target>
-
-<source>Never save &changes</source>
-<target></target>
-
-<source>Include via filter:</source>
-<target></target>
-
-<source>
-<pluralform>%y of 1 row in view</pluralform>
-<pluralform>%y of %x rows in view</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Execute</source>
-<target></target>
-
-<source>Confirm</source>
-<target></target>
-
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Select View</source>
-<target></target>
-
-<source>Filter Files</source>
-<target></target>
-
-<source>Main Bar</source>
-<target></target>
-
-<source>Folder Pairs</source>
-<target></target>
-
-<source>Select Time Span</source>
-<target></target>
-
-<source>Global Settings</source>
-<target></target>
-
-<source>Delete Items</source>
-<target></target>
-
-<source>Save as Batch Job</source>
-<target></target>
-
-<source>Restore hidden windows</source>
-<target></target>
-
-<source>Customize context menu:</source>
-<target></target>
-
-<source>Delay (in seconds):</source>
-<target></target>
-
-<source>Retry count:</source>
-<target></target>
-
-<source>Automatic retry on error:</source>
-<target></target>
-
-<source>Transfer file and folder permissions.</source>
-<target></target>
-
-<source>(requires administrator rights)</source>
-<target></target>
-
-<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target></target>
-
-<source>(recommended)</source>
-<target></target>
-
-<source>
-Copy to a temporary file (*.ffs_tmp) before overwriting target.
-This guarantees a consistent state even in case of a serious error.
-</source>
-<target></target>
-
-<source>The following settings are used for all synchronization jobs.</source>
-<target></target>
-
-<source>&Clear</source>
-<target></target>
-
-<source>Maximum:</source>
-<target></target>
-
-<source>Minimum:</source>
-<target></target>
-
-<source>File size:</source>
-<target></target>
-
-<source>Time span:</source>
-<target></target>
-
-<source>Exclude:</source>
-<target></target>
-
-<source>Include:</source>
-<target></target>
-
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target></target>
-
-<source>&Recycle bin</source>
-<target></target>
-
-<source>How can I schedule a batch job?</source>
-<target></target>
-
-<source>Limit:</source>
-<target></target>
-
-<source>Save log:</source>
-<target></target>
-
-<source>Stop synchronization at first error</source>
-<target></target>
-
-<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
-<target></target>
-
-<source>Stop</source>
-<target></target>
-
-<source>Minimize to notification area</source>
-<target></target>
-
-<source>&Don't show this dialog again</source>
-<target></target>
-
-<source>Variant:</source>
-<target></target>
-
-<source>Start synchronization now?</source>
-<target></target>
-
-<source>On completion:</source>
-<target></target>
-
-<source>Handle errors:</source>
-<target></target>
-
-<source>Show examples</source>
-<target></target>
-
-<source>Move files to a user-defined folder</source>
-<target></target>
-
-<source>Back up deleted and overwritten files in the recycle bin</source>
-<target></target>
-
-<source>Recycle bin</source>
-<target></target>
-
-<source>Delete files:</source>
-<target></target>
-
-<source>Requires database files. Not supported by all file systems.</source>
-<target></target>
-
-<source>Detect moved files</source>
-<target></target>
-
-<source>Copy new and updated files to the right folder.</source>
-<target></target>
-
-<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
-<target></target>
-
-<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
-<target></target>
-
-<source>More information</source>
-<target></target>
-
-<source>Symbolic links:</source>
-<target></target>
-
-<source>Identify equal files by comparing the file content.</source>
-<target></target>
-
-<source>Identify equal files by comparing modification time and size.</source>
-<target></target>
-
-<source>Select a variant:</source>
-<target></target>
-
-<source>Find:</source>
-<target></target>
-
-<source>Close search bar</source>
-<target></target>
-
-<source>&Check for new version</source>
-<target></target>
-
-<source>Check &automatically once a week</source>
-<target></target>
-
-<source>&Check now</source>
-<target></target>
-
-<source>&Tools</source>
-<target></target>
-
-<source>&Find...</source>
-<target></target>
-
-<source>Local Filter</source>
-<target></target>
-
-<source>Alternate Synchronization Settings</source>
-<target></target>
-
-<source>Alternate Comparison Settings</source>
-<target></target>
-
-<source>Paste</source>
-<target></target>
-
-<source>None</source>
-<target></target>
-
-<source>Active</source>
-<target></target>
-
-<source>Local filter</source>
-<target></target>
-
-<source>Alternate synchronization settings</source>
-<target></target>
-
-<source>Alternate comparison settings</source>
-<target></target>
-
-<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
-<target></target>
-
-<source>&Download</source>
-<target></target>
-
-<source>Check for Program Updates</source>
-<target></target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
-<source>Switching to FreeFileSync's main window</source>
-<target></target>
-
-<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target></target>
-
-<source>Synchronization stopped</source>
-<target></target>
-
-<source>job name</source>
-<target></target>
-
-<source>Data verification error: %x and %y have different content.</source>
-<target></target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target></target>
-
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target></target>
-
-<source>Please enter a target folder for versioning.</source>
-<target></target>
-
-<source>Incorrect command line:</source>
-<target></target>
-
-<source>&Show error</source>
-<target></target>
-
-<source>Waiting until all directories are available...</source>
-<target></target>
-
-<source>Directory monitoring active</source>
-<target></target>
-
-<source>Automated Synchronization</source>
-<target></target>
-
-<source>&Start</source>
-<target></target>
-
-<source>Command line:</source>
-<target></target>
-
-<source>Idle time (in seconds):</source>
-<target></target>
+<source>Both sides have changed since last synchronization.</source>
+<target>Begge sider er endret siden siste synkronisering.</target>
-<source>Folders to watch:</source>
-<target></target>
+<source>Cannot determine sync-direction:</source>
+<target>Kan ikke bestemme synkroniseringsretning:</target>
-<source>&View help</source>
-<target></target>
+<source>No change since last synchronization.</source>
+<target>Ingen endringer siden siste synkronisering.</target>
-<source>Unable to create timestamp for versioning:</source>
+<source>The database entry is not in sync considering current settings.</source>
<target></target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target></target>
+<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
+<target>Stiller inn standard synkroniseringsretning: Gamle filer blir overskrevet med nyere filer.</target>
-<source>Volume name %x is not part of file path %y.</source>
-<target></target>
+<source>Checking recycle bin availability for folder %x...</source>
+<target>Sjekker søppelbøtte for tilgjengelig mappe %x...</target>
-<source>Cannot determine volume name for %x.</source>
+<source>Moving file %x to the recycle bin</source>
<target></target>
-<source>Cannot access the Volume Shadow Copy Service.</source>
+<source>Moving folder %x to the recycle bin</source>
<target></target>
-<source>%x items/sec</source>
+<source>Moving symbolic link %x to the recycle bin</source>
<target></target>
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-</target>
+<source>Deleting file %x</source>
+<target>Sletter fil %x</target>
-<source>Cannot set directory lock for %x.</source>
-<target></target>
+<source>Deleting folder %x</source>
+<target>Sletter mappe %x</target>
-<source>
-<pluralform>1 byte</pluralform>
-<pluralform>%x bytes</pluralform>
-</source>
-<target>
-</target>
+<source>Deleting symbolic link %x</source>
+<target>Sletter symbolsk lenke %x</target>
-<source>Calculating sync directions...</source>
+<source>The recycle bin is not available for the following folders. Files will be deleted permanently instead:</source>
<target></target>
-<source>Starting comparison</source>
-<target></target>
+<source>An exception occurred</source>
+<target>Et avvik har oppstått</target>
-<source>Resolving symbolic link %x</source>
+<source>A directory path is expected after %x.</source>
<target></target>
-<source>The following folders have dependent paths. Be careful when setting up synchronization rules:</source>
+<source>Syntax error</source>
<target></target>
-<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
+<source>Cannot open file %x.</source>
<target></target>
-<source>The corresponding folder will be considered as empty.</source>
-<target></target>
+<source>File %x does not contain a valid configuration.</source>
+<target>Filen %x inneholder en ugyldig innstilling.</target>
-<source>Any number of alternative directories for at most one config file.</source>
+<source>Unequal number of left and right directories specified.</source>
<target></target>
-<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
+<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target></target>
-<source>directory</source>
+<source>Directories cannot be set for more than one configuration file.</source>
<target></target>
-<source>config files</source>
-<target></target>
+<source>Command line</source>
+<target>Kommandolinje</target>
<source>Syntax:</source>
<target></target>
-<source>Directories cannot be set for more than one configuration file.</source>
-<target></target>
-
-<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
-<target></target>
-
-<source>Unequal number of left and right directories specified.</source>
+<source>config files</source>
<target></target>
-<source>Cannot open file %x.</source>
+<source>directory</source>
<target></target>
-<source>Syntax error</source>
+<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
<target></target>
-<source>A directory path is expected after %x.</source>
+<source>Any number of alternative directories for at most one config file.</source>
<target></target>
-<source>The recycle bin is not available for the following folders. Files will be deleted permanently instead:</source>
-<target></target>
+<source>A folder input field is empty.</source>
+<target>Et mappefelt er tomt.</target>
-<source>Moving symbolic link %x to the recycle bin</source>
+<source>The corresponding folder will be considered as empty.</source>
<target></target>
-<source>Moving folder %x to the recycle bin</source>
-<target></target>
+<source>Cannot find the following folders:</source>
+<target>Kan ikke finne følgende mapper:</target>
-<source>Moving file %x to the recycle bin</source>
+<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
<target></target>
-<source>The database entry is not in sync considering current settings.</source>
+<source>The following folders have dependent paths. Be careful when setting up synchronization rules:</source>
<target></target>
-<source>Both sides have changed since last synchronization.</source>
-<target>Begge sider er endret siden siste synkronisering.</target>
-
-<source>Cannot determine sync-direction:</source>
-<target>Kan ikke bestemme synkroniseringsretning:</target>
-
-<source>No change since last synchronization.</source>
-<target>Ingen endringer siden siste synkronisering.</target>
-
-<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
-<target>Stiller inn standard synkroniseringsretning: Gamle filer blir overskrevet med nyere filer.</target>
-
-<source>Checking recycle bin availability for folder %x...</source>
-<target>Sjekker søppelbøtte for tilgjengelig mappe %x...</target>
-
-<source>Deleting file %x</source>
-<target>Sletter fil %x</target>
-
-<source>Deleting folder %x</source>
-<target>Sletter mappe %x</target>
-
-<source>Deleting symbolic link %x</source>
-<target>Sletter symbolsk lenke %x</target>
-
-<source>An exception occurred</source>
-<target>Et avvik har oppstått</target>
-
-<source>Error</source>
-<target>Feil</target>
-
-<source>File %x does not contain a valid configuration.</source>
-<target>Filen %x inneholder en ugyldig innstilling.</target>
-
-<source>Warning</source>
-<target>Advarsel</target>
-
-<source>Command line</source>
-<target>Kommandolinje</target>
-
-<source>A folder input field is empty.</source>
-<target>Et mappefelt er tomt.</target>
-
-<source>Cannot find the following folders:</source>
-<target>Kan ikke finne følgende mapper:</target>
-
<source>File %x has an invalid date.</source>
<target>Filen %x har en ugyldig dato.</target>
@@ -554,12 +118,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Items differ in attributes only</source>
<target>Elementer har kun forskjellige attributter</target>
+<source>Resolving symbolic link %x</source>
+<target></target>
+
<source>Comparing content of files %x</source>
<target>Sammenligner innhold til filer %x</target>
<source>Generating file list...</source>
<target>Lager filliste...</target>
+<source>Starting comparison</source>
+<target></target>
+
+<source>Calculating sync directions...</source>
+<target></target>
+
<source>Out of memory.</source>
<target>For lite minne.</target>
@@ -671,6 +244,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Total time:</source>
<target>Total tid:</target>
+<source>
+<pluralform>1 byte</pluralform>
+<pluralform>%x bytes</pluralform>
+</source>
+<target>
+</target>
+
<source>%x MB</source>
<target>%x MB</target>
@@ -683,15 +263,28 @@ This guarantees a consistent state even in case of a serious error.
<source>Error parsing file %x, row %y, column %z.</source>
<target>Feil ved analysering av fil %x, rekke %y, kolonne %z.</target>
+<source>Cannot set directory lock for %x.</source>
+<target></target>
+
<source>Scanning:</source>
<target>Skanner:</target>
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+</target>
+
<source>Encoding extended time information: %x</source>
<target>Koder utvided tidsinformasjon: %x</target>
<source>/sec</source>
<target>/sekund</target>
+<source>%x items/sec</source>
+<target></target>
+
<source>Configuration file %x loaded partially only.</source>
<target>Innstillingsfilen %x bare delvis lastet.</target>
@@ -704,12 +297,27 @@ This guarantees a consistent state even in case of a serious error.
<source>Browse directory</source>
<target>Utforsk mappe</target>
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target></target>
+
<source>Please use FreeFileSync 64-bit version to create shadow copies on this system.</source>
<target>Bruk FreeFileSync 64-bit-versjon til å opprette skyggekopier på dette systemet.</target>
<source>Cannot load file %x.</source>
<target>Kan ikke laste filen %x.</target>
+<source>Cannot determine volume name for %x.</source>
+<target></target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target></target>
+
+<source>Stop requested: Waiting for current operation to finish...</source>
+<target></target>
+
+<source>Unable to create timestamp for versioning:</source>
+<target></target>
+
<source>Cannot read the following XML elements:</source>
<target>Kan ikke lese følgende XML-elementer:</target>
@@ -725,6 +333,9 @@ This guarantees a consistent state even in case of a serious error.
<source>&Program</source>
<target>&Program</target>
+<source>&View help</source>
+<target></target>
+
<source>&About</source>
<target>&Om programmet</target>
@@ -746,6 +357,9 @@ This guarantees a consistent state even in case of a serious error.
<source>To get started just import a .ffs_batch file.</source>
<target>Importer en .ffs_batch-fil for å komme i gang</target>
+<source>Folders to watch:</source>
+<target></target>
+
<source>Add folder</source>
<target>Legg til mappe</target>
@@ -758,9 +372,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Select a folder</source>
<target>Velg en mappe</target>
+<source>Idle time (in seconds):</source>
+<target></target>
+
<source>Idle time between last detected change and execution of command</source>
<target>Inaktiv tid mellom forrige endring og utførelse av kommando</target>
+<source>Command line:</source>
+<target></target>
+
<source>
The command is triggered if:
- files or subfolders change
@@ -772,27 +392,45 @@ Kommandoen utløses hvis:
- nye mapper legges til (f.eks. en USB-pinne kobles til)
</target>
-<source>&Retry</source>
-<target>&Prøv igjen</target>
+<source>&Start</source>
+<target></target>
-<source>Cancel</source>
-<target>Avbryt</target>
+<source>About</source>
+<target>Om</target>
<source>Build: %x</source>
<target>Build: %x</target>
-<source>About</source>
-<target>Om</target>
-
<source>All files</source>
<target>Alle filer</target>
+<source>Automated Synchronization</source>
+<target></target>
+
+<source>Directory monitoring active</source>
+<target></target>
+
+<source>Waiting until all directories are available...</source>
+<target></target>
+
+<source>Error</source>
+<target>Feil</target>
+
<source>&Restore</source>
<target>&Gjenopprett</target>
+<source>&Show error</source>
+<target></target>
+
<source>&Exit</source>
<target>&Avslutt</target>
+<source>Incorrect command line:</source>
+<target></target>
+
+<source>&Retry</source>
+<target>&Prøv igjen</target>
+
<source>File content</source>
<target>Filinnhold</target>
@@ -853,12 +491,18 @@ Kommandoen utløses hvis:
<source>Target folder input field must not be empty.</source>
<target>Feltet for målmappe kan ikke være tomt.</target>
+<source>Please enter a target folder for versioning.</source>
+<target></target>
+
<source>Source folder %x not found.</source>
<target>Kildemappe %x finnes ikke.</target>
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>De følgende elementene har uoppklarte konflikter og vil ikke bli synkroniserte:</target>
+<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
+<target></target>
+
<source>Not enough free disk space available in:</source>
<target>Ikke nok ledig diskplass tilgjengelig på:</target>
@@ -877,6 +521,18 @@ Kommandoen utløses hvis:
<source>Generating database...</source>
<target>Oppretter database...</target>
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target></target>
+
+<source>Data verification error: %x and %y have different content.</source>
+<target></target>
+
+<source>job name</source>
+<target></target>
+
+<source>Synchronization stopped</source>
+<target></target>
+
<source>Synchronization completed with errors</source>
<target>Synkronisering fullført med feil</target>
@@ -892,21 +548,61 @@ Kommandoen utløses hvis:
<source>Saving log file %x...</source>
<target>Lagrer loggfil %x...</target>
+<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
+<target></target>
+
+<source>&Don't show this warning again</source>
+<target></target>
+
+<source>&Ignore</source>
+<target>&Ignorer</target>
+
+<source>&Switch</source>
+<target>&Skift</target>
+
+<source>Switching to FreeFileSync's main window</source>
+<target></target>
+
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target></target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target></target>
+
+<source>Check for Program Updates</source>
+<target></target>
+
<source>A new version of FreeFileSync is available:</source>
<target>En ny versjon av FreeFileSync er tilgjengelig</target>
<source>Download now?</source>
<target>Laste ned nå?</target>
+<source>&Download</source>
+<target></target>
+
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync er oppdatert.</target>
-<source>Information</source>
-<target>Informasjon</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Kan ikke koble til sourceforge.net.</target>
+<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
+<target></target>
+
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Symbolsk lenke</target>
@@ -958,6 +654,21 @@ Kommandoen utløses hvis:
<source>Hibernate</source>
<target>Sett i dvalemodus</target>
+<source>Alternate comparison settings</source>
+<target></target>
+
+<source>Alternate synchronization settings</source>
+<target></target>
+
+<source>Local filter</source>
+<target></target>
+
+<source>Active</source>
+<target></target>
+
+<source>None</source>
+<target></target>
+
<source>Remove alternate settings</source>
<target>Fjern alternative innstillinger</target>
@@ -967,6 +678,18 @@ Kommandoen utløses hvis:
<source>Copy</source>
<target>Kopier</target>
+<source>Paste</source>
+<target></target>
+
+<source>Alternate Comparison Settings</source>
+<target></target>
+
+<source>Alternate Synchronization Settings</source>
+<target></target>
+
+<source>Local Filter</source>
+<target></target>
+
<source>&New</source>
<target>&Ny</target>
@@ -988,12 +711,30 @@ Kommandoen utløses hvis:
<source>&Language</source>
<target>&Språk</target>
+<source>&Find...</source>
+<target></target>
+
<source>&Export file list...</source>
<target>&Eksporter filliste...</target>
+<source>&Tools</source>
+<target></target>
+
+<source>&Check now</source>
+<target></target>
+
+<source>Check &automatically once a week</source>
+<target></target>
+
+<source>&Check for new version</source>
+<target></target>
+
<source>Compare</source>
<target>Sammenlign</target>
+<source>Cancel</source>
+<target>Avbryt</target>
+
<source>Synchronize</source>
<target>Synkroniser</target>
@@ -1006,6 +747,12 @@ Kommandoen utløses hvis:
<source>Swap sides</source>
<target>Bytt sider</target>
+<source>Close search bar</source>
+<target></target>
+
+<source>Find:</source>
+<target></target>
+
<source>Match case</source>
<target>Skill mellom store og små bokstaver</target>
@@ -1030,24 +777,72 @@ Kommandoen utløses hvis:
<source>Total bytes to copy</source>
<target>Mengde bytes å kopiere</target>
+<source>Select a variant:</source>
+<target></target>
+
+<source>Identify equal files by comparing modification time and size.</source>
+<target></target>
+
+<source>Identify equal files by comparing the file content.</source>
+<target></target>
+
+<source>Symbolic links:</source>
+<target></target>
+
+<source>More information</source>
+<target></target>
+
<source>OK</source>
<target>OK</target>
+<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
+<target></target>
+
+<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
+<target></target>
+
+<source>Copy new and updated files to the right folder.</source>
+<target></target>
+
<source>Configure your own synchronization rules.</source>
<target>Still inn dine egne synkroniseringsregler.</target>
+<source>Detect moved files</source>
+<target></target>
+
+<source>Requires database files. Not supported by all file systems.</source>
+<target></target>
+
+<source>Delete files:</source>
+<target></target>
+
<source>Permanent</source>
<target>Permanent</target>
<source>Delete or overwrite files permanently</source>
<target>Slett eller overskriv filer permanent</target>
+<source>Recycle bin</source>
+<target></target>
+
+<source>Back up deleted and overwritten files in the recycle bin</source>
+<target></target>
+
<source>Versioning</source>
<target>Versjonshåndtering</target>
+<source>Move files to a user-defined folder</source>
+<target></target>
+
<source>Naming convention:</source>
<target>Navnekonvensjon:</target>
+<source>Show examples</source>
+<target></target>
+
+<source>Handle errors:</source>
+<target></target>
+
<source>Ignore</source>
<target>Ignorer</target>
@@ -1060,9 +855,21 @@ Kommandoen utløses hvis:
<source>Show pop-up on errors or warnings</source>
<target>Vis pop-upvindu ved feil eller advarsler</target>
+<source>On completion:</source>
+<target></target>
+
+<source>Start synchronization now?</source>
+<target></target>
+
+<source>Variant:</source>
+<target></target>
+
<source>Statistics</source>
<target>Statistikk</target>
+<source>&Don't show this dialog again</source>
+<target></target>
+
<source>Items found:</source>
<target>Elementer funnet:</target>
@@ -1078,36 +885,120 @@ Kommandoen utløses hvis:
<source>Synchronizing...</source>
<target>Synkroniserer...</target>
+<source>Minimize to notification area</source>
+<target></target>
+
<source>Close</source>
<target>Lukk</target>
<source>&Pause</source>
<target>&Pause</target>
+<source>Stop</source>
+<target></target>
+
+<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
+<target></target>
+
+<source>Stop synchronization at first error</source>
+<target></target>
+
<source>Show progress dialog</source>
<target>Vis statuslinje</target>
+<source>Save log:</source>
+<target></target>
+
+<source>Limit:</source>
+<target></target>
+
<source>Limit maximum number of log files</source>
<target>Begrens maks antall loggfiler</target>
+<source>How can I schedule a batch job?</source>
+<target></target>
+
+<source>&Recycle bin</source>
+<target></target>
+
<source>Delete on both sides</source>
<target>Slett på begge sider</target>
<source>Delete on both sides even if the file is selected on one side only</source>
<target>Slett på begge sider selv om filen bare er valgt på en side</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target></target>
+
+<source>Include:</source>
+<target></target>
+
+<source>Exclude:</source>
+<target></target>
+
+<source>Time span:</source>
+<target></target>
+
+<source>File size:</source>
+<target></target>
+
+<source>Minimum:</source>
+<target></target>
+
+<source>Maximum:</source>
+<target></target>
+
+<source>&Clear</source>
+<target></target>
+
+<source>The following settings are used for all synchronization jobs.</source>
+<target></target>
+
<source>Fail-safe file copy</source>
<target>Trygg filkopi</target>
+<source>
+Copy to a temporary file (*.ffs_tmp) before overwriting target.
+This guarantees a consistent state even in case of a serious error.
+</source>
+<target></target>
+
+<source>(recommended)</source>
+<target></target>
+
<source>Copy locked files</source>
<target>Kopier låste filer</target>
+<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
+<target></target>
+
+<source>(requires administrator rights)</source>
+<target></target>
+
<source>Copy file access permissions</source>
<target>Kopier filadgangstillatelser</target>
+<source>Transfer file and folder permissions.</source>
+<target></target>
+
+<source>Automatic retry on error:</source>
+<target></target>
+
+<source>Retry count:</source>
+<target></target>
+
+<source>Delay (in seconds):</source>
+<target></target>
+
+<source>Customize context menu:</source>
+<target></target>
+
<source>Description</source>
<target>Beskrivelse</target>
+<source>Restore hidden windows</source>
+<target></target>
+
<source>&Default</source>
<target>&Standard</target>
@@ -1135,6 +1026,21 @@ Kommandoen utløses hvis:
<source>Many thanks for localization:</source>
<target>Mange takk for lokalisering:</target>
+<source>Save as Batch Job</source>
+<target></target>
+
+<source>Delete Items</source>
+<target></target>
+
+<source>Global Settings</source>
+<target></target>
+
+<source>Select Time Span</source>
+<target></target>
+
+<source>Folder Pairs</source>
+<target></target>
+
<source>Find</source>
<target>Søk</target>
@@ -1144,6 +1050,15 @@ Kommandoen utløses hvis:
<source>Configuration</source>
<target>Innstilling</target>
+<source>Main Bar</source>
+<target></target>
+
+<source>Filter Files</source>
+<target></target>
+
+<source>Select View</source>
+<target></target>
+
<source>Open...</source>
<target>Åpne...</target>
@@ -1162,6 +1077,19 @@ Kommandoen utløses hvis:
<source>Start synchronization</source>
<target>Start synkronisering</target>
+<source>Confirm</source>
+<target></target>
+
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Execute</source>
+<target></target>
+
<source>
<pluralform>1 directory</pluralform>
<pluralform>%x directories</pluralform>
@@ -1180,12 +1108,22 @@ Kommandoen utløses hvis:
<pluralform>%x filer</pluralform>
</target>
+<source>
+<pluralform>%y of 1 row in view</pluralform>
+<pluralform>%y of %x rows in view</pluralform>
+</source>
+<target>
+</target>
+
<source>Set direction:</source>
<target>Still inn retningen:</target>
<source>multiple selection</source>
<target>flervalg</target>
+<source>Include via filter:</source>
+<target></target>
+
<source>Exclude via filter:</source>
<target>Ekskluder via filter:</target>
@@ -1240,6 +1178,9 @@ Kommandoen utløses hvis:
<source>Do you want to save changes to %x?</source>
<target>Vil du lagre endringene til %x?</target>
+<source>Never save &changes</source>
+<target></target>
+
<source>Do&n't save</source>
<target>&Ikke lagre</target>
@@ -1294,23 +1235,23 @@ Kommandoen utløses hvis:
<source>All folders are in sync</source>
<target>Alle mapper er synkroniserte</target>
+<source>Synchronization Settings</source>
+<target></target>
+
+<source>Comparison Settings</source>
+<target></target>
+
<source>Cannot find %x</source>
<target>Kan ikke finne %x</target>
+<source>Comma-separated values</source>
+<target></target>
+
<source>File list exported</source>
<target>Filliste eksportert</target>
-<source>&Ignore</source>
-<target>&Ignorer</target>
-
-<source>&Switch</source>
-<target>&Skift</target>
-
-<source>&Yes</source>
-<target>&Ja</target>
-
-<source>&No</source>
-<target>&Nei</target>
+<source>Searching for program updates...</source>
+<target></target>
<source>Scanning...</source>
<target>Skanner...</target>
@@ -1321,15 +1262,27 @@ Kommandoen utløses hvis:
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Advarsel</target>
+
<source>Paused</source>
<target>Pauset</target>
<source>Initializing...</source>
<target>Initialiserer...</target>
+<source>Stopped</source>
+<target></target>
+
<source>Completed</source>
<target>Fullført</target>
+<source>&Continue</source>
+<target></target>
+
+<source>Log</source>
+<target></target>
+
<source>Today</source>
<target>Idag</target>
@@ -1354,6 +1307,23 @@ Kommandoen utløses hvis:
<source>MB</source>
<target>MB</target>
+<source>
+<pluralform>Do you really want to move the following item to the recycle bin?</pluralform>
+<pluralform>Do you really want to move the following %x items to the recycle bin?</pluralform>
+</source>
+<target>
+</target>
+
+<source>Move</source>
+<target></target>
+
+<source>
+<pluralform>Do you really want to delete the following item?</pluralform>
+<pluralform>Do you really want to delete the following %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>Exclude</source>
<target>Ekskluder</target>
@@ -1381,6 +1351,9 @@ Kommandoen utløses hvis:
<source>- Other side's counterpart to %item_folder%</source>
<target>- Den andre sidens motpart til %item_folder%</target>
+<source>Restore all hidden windows and warnings?</source>
+<target></target>
+
<source>Leave as unresolved conflict</source>
<target>Etterlat som uløste konflikter</target>
@@ -1390,6 +1363,9 @@ Kommandoen utløses hvis:
<source>Move files and replace if existing</source>
<target>Flytt filer og erstatt hvis eksisterer</target>
+<source>Time stamp</source>
+<target></target>
+
<source>Append a timestamp to each file name</source>
<target>Legg til et tidsstempel til hvert filnavn</target>
@@ -1402,6 +1378,9 @@ Kommandoen utløses hvis:
<source>Files</source>
<target>Filer</target>
+<source>Items</source>
+<target></target>
+
<source>Percentage</source>
<target>Prosent</target>
@@ -1444,6 +1423,9 @@ Kommandoen utløses hvis:
<source>Cannot create directory %x.</source>
<target>Kan ikke opprette mappen %x.</target>
+<source>Cannot create symbolic link %x.</source>
+<target></target>
+
<source>Cannot find system function %x.</source>
<target>Kan ikke finne systemfunksjonen %x.</target>
@@ -1495,12 +1477,24 @@ Kommandoen utløses hvis:
<pluralform>%x dager</pluralform>
</target>
+<source>Unable to register to receive system messages.</source>
+<target></target>
+
<source>Cannot set privilege %x.</source>
<target>Kan ikke sette privilegie %x.</target>
+<source>Unable to suspend system sleep mode.</source>
+<target></target>
+
<source>Cannot change process I/O priorities.</source>
<target>Kan ikke endre I/O prioriet på prosess</target>
+<source>Unable to move %x to the recycle bin.</source>
+<target></target>
+
+<source>Cannot determine final path for %x.</source>
+<target></target>
+
<source>Error Code %x:</source>
<target>Feil kode %x:</target>
diff --git a/BUILD/Languages/turkish.lng b/FreeFileSync/Build/Languages/outdated/turkish.lng
index 7ab30b7f..99823c18 100644
--- a/BUILD/Languages/turkish.lng
+++ b/FreeFileSync/Build/Languages/outdated/turkish.lng
@@ -7,266 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Unable to suspend system sleep mode.</source>
-<target></target>
-
-<source>Unable to register to receive system messages.</source>
-<target></target>
-
-<source>Restore all hidden windows and warnings?</source>
-<target></target>
-
-<source>Move</source>
-<target></target>
-
-<source>Stopped</source>
-<target></target>
-
-<source>Serious Error</source>
-<target></target>
-
-<source>Comparison Settings</source>
-<target></target>
-
-<source>Synchronization Settings</source>
-<target></target>
-
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Select View</source>
-<target></target>
-
-<source>Filter Files</source>
-<target></target>
-
-<source>Main Bar</source>
-<target></target>
-
-<source>Folder Pairs</source>
-<target></target>
-
-<source>Select Time Span</source>
-<target></target>
-
-<source>Global Settings</source>
-<target></target>
-
-<source>Delete Items</source>
-<target></target>
-
-<source>Save as Batch Job</source>
-<target></target>
-
-<source>Restore hidden windows</source>
-<target></target>
-
-<source>Customize context menu:</source>
-<target></target>
-
-<source>Delay (in seconds):</source>
-<target></target>
-
-<source>Retry count:</source>
-<target></target>
-
-<source>Automatic retry on error:</source>
-<target></target>
-
-<source>Transfer file and folder permissions.</source>
-<target></target>
-
-<source>(requires administrator rights)</source>
-<target></target>
-
-<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target></target>
-
-<source>(recommended)</source>
-<target></target>
-
-<source>
-Copy to a temporary file (*.ffs_tmp) before overwriting target.
-This guarantees a consistent state even in case of a serious error.
-</source>
-<target></target>
-
-<source>The following settings are used for all synchronization jobs.</source>
-<target></target>
-
-<source>Maximum:</source>
-<target></target>
-
-<source>Minimum:</source>
-<target></target>
-
-<source>File size:</source>
-<target></target>
-
-<source>Time span:</source>
-<target></target>
-
-<source>Exclude:</source>
-<target></target>
-
-<source>Include:</source>
-<target></target>
-
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target></target>
-
-<source>&Recycle bin</source>
-<target></target>
-
-<source>How can I schedule a batch job?</source>
-<target></target>
-
-<source>Limit:</source>
-<target></target>
-
-<source>Save log:</source>
-<target></target>
-
-<source>Stop synchronization at first error</source>
-<target></target>
-
-<source>Stop</source>
-<target></target>
-
-<source>Variant:</source>
-<target></target>
-
-<source>Start synchronization now?</source>
-<target></target>
-
-<source>On completion:</source>
-<target></target>
-
-<source>Handle errors:</source>
-<target></target>
-
-<source>Show examples</source>
-<target></target>
-
-<source>Delete files:</source>
-<target></target>
-
-<source>Copy new and updated files to the right folder.</source>
-<target></target>
-
-<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
-<target></target>
-
-<source>More information</source>
-<target></target>
-
-<source>Symbolic links:</source>
-<target></target>
-
-<source>Identify equal files by comparing the file content.</source>
-<target></target>
-
-<source>Identify equal files by comparing modification time and size.</source>
-<target></target>
-
-<source>Select a variant:</source>
-<target></target>
-
-<source>Find:</source>
-<target></target>
-
-<source>Close search bar</source>
-<target></target>
-
-<source>&Check for new version</source>
-<target></target>
-
-<source>&Find...</source>
-<target></target>
-
-<source>Local Filter</source>
-<target></target>
-
-<source>Alternate Synchronization Settings</source>
-<target></target>
-
-<source>Alternate Comparison Settings</source>
-<target></target>
-
-<source>None</source>
-<target></target>
-
-<source>Active</source>
-<target></target>
-
-<source>Local filter</source>
-<target></target>
-
-<source>Alternate synchronization settings</source>
-<target></target>
-
-<source>Alternate comparison settings</source>
-<target></target>
-
-<source>Check for Program Updates</source>
-<target></target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
-<source>Switching to FreeFileSync's main window</source>
-<target></target>
-
-<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target></target>
-
-<source>Synchronization stopped</source>
-<target></target>
-
-<source>Please enter a target folder for versioning.</source>
-<target></target>
-
-<source>Incorrect command line:</source>
-<target></target>
-
-<source>Automated Synchronization</source>
-<target></target>
-
-<source>&Start</source>
-<target></target>
-
-<source>Command line:</source>
-<target></target>
-
-<source>Idle time (in seconds):</source>
-<target></target>
-
-<source>Folders to watch:</source>
-<target></target>
-
-<source>&View help</source>
-<target></target>
-
-<source>Unable to create timestamp for versioning:</source>
-<target></target>
-
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target></target>
-
-<source>%x items/sec</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Son eşleştirmeden bu yana iki tarafın da içeriği değişmiş.</target>
@@ -318,9 +58,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot open file %x.</source>
<target>%x dosyası açılamıyor.</target>
-<source>Error</source>
-<target>Hata</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>%x dosyası geçerli ayar bilgilerini içermiyor.</target>
@@ -330,12 +67,12 @@ This guarantees a consistent state even in case of a serious error.
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Klasörler komut satırından seçildiğinde, ayar dosyasında klasör çifti düzeyinde ayar bulunmamalıdır.</target>
-<source>Warning</source>
-<target>Uyarı</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Klasörler bir ayar dosyasından fazlasında kullanılamaz.</target>
+<source>Command line</source>
+<target>Komut satırı</target>
+
<source>Syntax:</source>
<target>Yazım:</target>
@@ -351,9 +88,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Any number of alternative directories for at most one config file.</source>
<target>En çok bir ayar dosyası için alternatif klasörlerin sayısı.</target>
-<source>Command line</source>
-<target>Komut satırı</target>
-
<source>A folder input field is empty.</source>
<target>Bir klasör giriş alanı boş.</target>
@@ -552,6 +286,9 @@ This guarantees a consistent state even in case of a serious error.
<source>/sec</source>
<target>/saniye</target>
+<source>%x items/sec</source>
+<target></target>
+
<source>Configuration file %x loaded partially only.</source>
<target>%x ayarlar dosyası kısmen yüklendi.</target>
@@ -579,6 +316,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Volume name %x is not part of file path %y.</source>
<target>%x birim adı %y dosya yolunun bir parçası değil.</target>
+<source>Stop requested: Waiting for current operation to finish...</source>
+<target></target>
+
+<source>Unable to create timestamp for versioning:</source>
+<target></target>
+
<source>Cannot read the following XML elements:</source>
<target>Şu XML elemanları okunamadı:</target>
@@ -594,6 +337,9 @@ This guarantees a consistent state even in case of a serious error.
<source>&Program</source>
<target>&Dosya</target>
+<source>&View help</source>
+<target></target>
+
<source>&About</source>
<target>H&akkında</target>
@@ -615,6 +361,9 @@ This guarantees a consistent state even in case of a serious error.
<source>To get started just import a .ffs_batch file.</source>
<target>.ffs_batch dosyasını yükleyerek başlayabilirsiniz.</target>
+<source>Folders to watch:</source>
+<target></target>
+
<source>Add folder</source>
<target>Klasör ekleyin</target>
@@ -627,9 +376,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Select a folder</source>
<target>Bir klasör seçin</target>
+<source>Idle time (in seconds):</source>
+<target></target>
+
<source>Idle time between last detected change and execution of command</source>
<target>Son algılanan değişiklik ile komutun yürütülmesi arasında beklenecek süre</target>
+<source>Command line:</source>
+<target></target>
+
<source>
The command is triggered if:
- files or subfolders change
@@ -641,27 +396,30 @@ Komut şu durumlarda yürütülür:
- yeni klasörler algılandığında (örneğin bir USB bellek takıldığında)
</target>
-<source>&Retry</source>
-<target>&Yeniden deneyin</target>
+<source>&Start</source>
+<target></target>
-<source>Cancel</source>
-<target>İptal</target>
+<source>About</source>
+<target>Hakkında</target>
<source>Build: %x</source>
<target>Yapım: %x</target>
-<source>About</source>
-<target>Hakkında</target>
-
<source>All files</source>
<target>Tüm dosyalar</target>
+<source>Automated Synchronization</source>
+<target></target>
+
<source>Directory monitoring active</source>
<target>Klasör izleme kullanılıyor</target>
<source>Waiting until all directories are available...</source>
<target>Tüm klasörlerin uygun olması bekleniyor...</target>
+<source>Error</source>
+<target>Hata</target>
+
<source>&Restore</source>
<target>Gö&rüntülensin</target>
@@ -671,6 +429,12 @@ Komut şu durumlarda yürütülür:
<source>&Exit</source>
<target>Çı&kın</target>
+<source>Incorrect command line:</source>
+<target></target>
+
+<source>&Retry</source>
+<target>&Yeniden deneyin</target>
+
<source>File content</source>
<target>İçeriğe göre</target>
@@ -731,6 +495,9 @@ Komut şu durumlarda yürütülür:
<source>Target folder input field must not be empty.</source>
<target>Hedef klasör giriş alanı boş olmamalı.</target>
+<source>Please enter a target folder for versioning.</source>
+<target></target>
+
<source>Source folder %x not found.</source>
<target>%x kaynak klasörü bulunamadı.</target>
@@ -767,6 +534,9 @@ Komut şu durumlarda yürütülür:
<source>job name</source>
<target>iş adı</target>
+<source>Synchronization stopped</source>
+<target></target>
+
<source>Synchronization completed with errors</source>
<target>Eşleştirme bazı hatalarla tamamlandı</target>
@@ -782,6 +552,40 @@ Komut şu durumlarda yürütülür:
<source>Saving log file %x...</source>
<target>%x günlük dosyası kaydediliyor...</target>
+<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
+<target></target>
+
+<source>&Don't show this warning again</source>
+<target>Bu uyarı bir daha &görüntülenmesin</target>
+
+<source>&Ignore</source>
+<target>&Yoksayın</target>
+
+<source>&Switch</source>
+<target>&Değiştirin</target>
+
+<source>Switching to FreeFileSync's main window</source>
+<target></target>
+
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>Sonraki &hatalar yoksayılsın</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target></target>
+
+<source>Check for Program Updates</source>
+<target></target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Yeni bir FreeFileSync sürümü yayınlanmış:</target>
@@ -794,15 +598,15 @@ Komut şu durumlarda yürütülür:
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync güncel.</target>
-<source>Information</source>
-<target>Bilgi</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>sourceforge.net sitesine bağlanılamıyor.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Geçerli FreeFileSync sürüm numarası çevrimiçi olarak bulunamıyor. El ile denetlemek ister misiniz?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Smblkbağlantı</target>
@@ -854,6 +658,21 @@ Komut şu durumlarda yürütülür:
<source>Hibernate</source>
<target>Hazırda bekletilsin</target>
+<source>Alternate comparison settings</source>
+<target></target>
+
+<source>Alternate synchronization settings</source>
+<target></target>
+
+<source>Local filter</source>
+<target></target>
+
+<source>Active</source>
+<target></target>
+
+<source>None</source>
+<target></target>
+
<source>Remove alternate settings</source>
<target>Alternatif ayarları silin</target>
@@ -866,6 +685,15 @@ Komut şu durumlarda yürütülür:
<source>Paste</source>
<target>Yapıştırın</target>
+<source>Alternate Comparison Settings</source>
+<target></target>
+
+<source>Alternate Synchronization Settings</source>
+<target></target>
+
+<source>Local Filter</source>
+<target></target>
+
<source>&New</source>
<target>Ye&ni</target>
@@ -887,6 +715,9 @@ Komut şu durumlarda yürütülür:
<source>&Language</source>
<target>Di&l</target>
+<source>&Find...</source>
+<target></target>
+
<source>&Export file list...</source>
<target>Dosya list&esini verin...</target>
@@ -899,9 +730,15 @@ Komut şu durumlarda yürütülür:
<source>Check &automatically once a week</source>
<target>&Haftada bir kendiliğinden denetlensin</target>
+<source>&Check for new version</source>
+<target></target>
+
<source>Compare</source>
<target>Karşılaştırın</target>
+<source>Cancel</source>
+<target>İptal</target>
+
<source>Synchronize</source>
<target>Eşleştirin</target>
@@ -914,6 +751,12 @@ Komut şu durumlarda yürütülür:
<source>Swap sides</source>
<target>Sağ ve sol tarafları değiştirin</target>
+<source>Close search bar</source>
+<target></target>
+
+<source>Find:</source>
+<target></target>
+
<source>Match case</source>
<target>Büyük/küçük harfe uyulsun</target>
@@ -938,12 +781,33 @@ Komut şu durumlarda yürütülür:
<source>Total bytes to copy</source>
<target>Toplam kopyalanacak bayt</target>
+<source>Select a variant:</source>
+<target></target>
+
+<source>Identify equal files by comparing modification time and size.</source>
+<target></target>
+
+<source>Identify equal files by comparing the file content.</source>
+<target></target>
+
+<source>Symbolic links:</source>
+<target></target>
+
+<source>More information</source>
+<target></target>
+
<source>OK</source>
<target>Tamam</target>
<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
<target>İki taraftaki değişiklikler belirlenir ve kopyalanır. Silme, taşıma ve çakışmalar, veritabanı kullanılarak kendiliğinden algılanır.</target>
+<source>Create a mirror backup of the left folder which exactly matches the right folder after synchronization.</source>
+<target></target>
+
+<source>Copy new and updated files to the right folder.</source>
+<target></target>
+
<source>Configure your own synchronization rules.</source>
<target>Eşleştirme kurallarını istediğiniz şekilde ayarlayabilirsiniz.</target>
@@ -953,6 +817,9 @@ Komut şu durumlarda yürütülür:
<source>Requires database files. Not supported by all file systems.</source>
<target>Veritabanı dosyalarına gerek duyar. Tüm dosya sistemleri tarafından desteklenmez.</target>
+<source>Delete files:</source>
+<target></target>
+
<source>Permanent</source>
<target>Kalıcı olarak silinsin</target>
@@ -974,6 +841,12 @@ Komut şu durumlarda yürütülür:
<source>Naming convention:</source>
<target>Adlandırma kuralı:</target>
+<source>Show examples</source>
+<target></target>
+
+<source>Handle errors:</source>
+<target></target>
+
<source>Ignore</source>
<target>Yoksayılsın</target>
@@ -986,6 +859,15 @@ Komut şu durumlarda yürütülür:
<source>Show pop-up on errors or warnings</source>
<target>Hata ya da uyarılar açılır pencerede görüntülenir</target>
+<source>On completion:</source>
+<target></target>
+
+<source>Start synchronization now?</source>
+<target></target>
+
+<source>Variant:</source>
+<target></target>
+
<source>Statistics</source>
<target>İstatistikler</target>
@@ -1016,36 +898,111 @@ Komut şu durumlarda yürütülür:
<source>&Pause</source>
<target>&Duraklatılsın</target>
+<source>Stop</source>
+<target></target>
+
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Katılımsız eşleştirme için bir toplu iş dosyası oluşturun. İşlemi başlatmak için bu dosyaya çift tıklayın ya da görev zamanlayıcı ile programlayın: %x</target>
+<source>Stop synchronization at first error</source>
+<target></target>
+
<source>Show progress dialog</source>
<target>İşlem penceresi görüntülensin</target>
+<source>Save log:</source>
+<target></target>
+
+<source>Limit:</source>
+<target></target>
+
<source>Limit maximum number of log files</source>
<target>Tutulacak en fazla günlük dosyası sayısı</target>
+<source>How can I schedule a batch job?</source>
+<target></target>
+
+<source>&Recycle bin</source>
+<target></target>
+
<source>Delete on both sides</source>
<target>Her iki taraftaki de silinsin</target>
<source>Delete on both sides even if the file is selected on one side only</source>
<target>Dosya yalnız bir tarafta seçili olsa bile her iki taraftaki de silinir</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target></target>
+
+<source>Include:</source>
+<target></target>
+
+<source>Exclude:</source>
+<target></target>
+
+<source>Time span:</source>
+<target></target>
+
+<source>File size:</source>
+<target></target>
+
+<source>Minimum:</source>
+<target></target>
+
+<source>Maximum:</source>
+<target></target>
+
<source>&Clear</source>
<target>&Temizleyin</target>
+<source>The following settings are used for all synchronization jobs.</source>
+<target></target>
+
<source>Fail-safe file copy</source>
<target>Dosyalar hatasız kopyalansın</target>
+<source>
+Copy to a temporary file (*.ffs_tmp) before overwriting target.
+This guarantees a consistent state even in case of a serious error.
+</source>
+<target></target>
+
+<source>(recommended)</source>
+<target></target>
+
<source>Copy locked files</source>
<target>Kilitli dosyalar da kopyalansın</target>
+<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
+<target></target>
+
+<source>(requires administrator rights)</source>
+<target></target>
+
<source>Copy file access permissions</source>
<target>Dosya erişim izinleri de kopyalansın</target>
+<source>Transfer file and folder permissions.</source>
+<target></target>
+
+<source>Automatic retry on error:</source>
+<target></target>
+
+<source>Retry count:</source>
+<target></target>
+
+<source>Delay (in seconds):</source>
+<target></target>
+
+<source>Customize context menu:</source>
+<target></target>
+
<source>Description</source>
<target>Açıklama</target>
+<source>Restore hidden windows</source>
+<target></target>
+
<source>&Default</source>
<target>&Varsayılan</target>
@@ -1073,6 +1030,21 @@ Komut şu durumlarda yürütülür:
<source>Many thanks for localization:</source>
<target>Çeviriler için çok teşekkürler:</target>
+<source>Save as Batch Job</source>
+<target></target>
+
+<source>Delete Items</source>
+<target></target>
+
+<source>Global Settings</source>
+<target></target>
+
+<source>Select Time Span</source>
+<target></target>
+
+<source>Folder Pairs</source>
+<target></target>
+
<source>Find</source>
<target>Arayın</target>
@@ -1082,6 +1054,15 @@ Komut şu durumlarda yürütülür:
<source>Configuration</source>
<target>İşlemler</target>
+<source>Main Bar</source>
+<target></target>
+
+<source>Filter Files</source>
+<target></target>
+
+<source>Select View</source>
+<target></target>
+
<source>Open...</source>
<target>Açın...</target>
@@ -1103,6 +1084,13 @@ Komut şu durumlarda yürütülür:
<source>Confirm</source>
<target>Onaylayın</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>Çalış&tırın</target>
@@ -1196,12 +1184,12 @@ Komut şu durumlarda yürütülür:
<source>Do you want to save changes to %x?</source>
<target>Değişiklikleri %x dosyasına kaydetmek istiyor musunuz?</target>
-<source>Do&n't save</source>
-<target>Kaydedilmesi&n</target>
-
<source>Never save &changes</source>
<target>Değişiklikler asla &kaydedilmesin</target>
+<source>Do&n't save</source>
+<target>Kaydedilmesi&n</target>
+
<source>Filter</source>
<target>Süzgeç</target>
@@ -1253,6 +1241,12 @@ Komut şu durumlarda yürütülür:
<source>All folders are in sync</source>
<target>Tüm klasörler eşleştirildi</target>
+<source>Synchronization Settings</source>
+<target></target>
+
+<source>Comparison Settings</source>
+<target></target>
+
<source>Cannot find %x</source>
<target>%x bulunamadı</target>
@@ -1265,24 +1259,6 @@ Komut şu durumlarda yürütülür:
<source>Searching for program updates...</source>
<target>Yazılım güncellemesine bakılıyor...</target>
-<source>&Ignore subsequent errors</source>
-<target>Sonraki &hatalar yoksayılsın</target>
-
-<source>&Ignore</source>
-<target>&Yoksayın</target>
-
-<source>&Don't show this warning again</source>
-<target>Bu uyarı bir daha &görüntülenmesin</target>
-
-<source>&Switch</source>
-<target>&Değiştirin</target>
-
-<source>&Yes</source>
-<target>&Evet</target>
-
-<source>&No</source>
-<target>&Hayır</target>
-
<source>Scanning...</source>
<target>Taranıyor...</target>
@@ -1292,12 +1268,18 @@ Komut şu durumlarda yürütülür:
<source>Info</source>
<target>Bilgi</target>
+<source>Warning</source>
+<target>Uyarı</target>
+
<source>Paused</source>
<target>Duraklatıldı</target>
<source>Initializing...</source>
<target>Başlatılıyor...</target>
+<source>Stopped</source>
+<target></target>
+
<source>Completed</source>
<target>Tamamlandı</target>
@@ -1340,6 +1322,9 @@ Komut şu durumlarda yürütülür:
<pluralform>Aşağıdaki %x ögeyi Geri Dönüşüm Kutusuna atmak istediğinize emin misiniz?</pluralform>
</target>
+<source>Move</source>
+<target></target>
+
<source>
<pluralform>Do you really want to delete the following item?</pluralform>
<pluralform>Do you really want to delete the following %x items?</pluralform>
@@ -1376,6 +1361,9 @@ Komut şu durumlarda yürütülür:
<source>- Other side's counterpart to %item_folder%</source>
<target>%item_folder% ögesinin diğer taraftaki karşılığı</target>
+<source>Restore all hidden windows and warnings?</source>
+<target></target>
+
<source>Leave as unresolved conflict</source>
<target>Uyuşmazlık çözülmeden bırakılsın</target>
@@ -1499,9 +1487,15 @@ Komut şu durumlarda yürütülür:
<pluralform>%x gün</pluralform>
</target>
+<source>Unable to register to receive system messages.</source>
+<target></target>
+
<source>Cannot set privilege %x.</source>
<target>%x izni verilemedi.</target>
+<source>Unable to suspend system sleep mode.</source>
+<target></target>
+
<source>Cannot change process I/O priorities.</source>
<target>Giriş/Çıkış işlemi öncelikleri değiştirilemedi</target>
diff --git a/BUILD/Languages/polish.lng b/FreeFileSync/Build/Languages/polish.lng
index 32b40d31..63fff3f2 100644
--- a/BUILD/Languages/polish.lng
+++ b/FreeFileSync/Build/Languages/polish.lng
@@ -7,26 +7,6 @@
<plural_definition>n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Obie strony uległy zmianie od ostatniej synchronizacji.</target>
@@ -590,9 +570,19 @@ Komenda jest wykonywana gdy:
<source>Switching to FreeFileSync's main window</source>
<target>Przejdź do głównego okna FreeFileSync.</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
<source>&Ignore subsequent errors</source>
<target>&Ignoruj kolejne błędy</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Poważny błąd</target>
@@ -617,6 +607,9 @@ Komenda jest wykonywana gdy:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Nie można znaleźć obecnej wersji FreeFileSync. Czy chcesz sprawdzić ręcznie?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Dowiązanie symboliczne</target>
@@ -1097,6 +1090,13 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Confirm</source>
<target>Potwierdź</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Wykonaj</target>
diff --git a/BUILD/Languages/portuguese.lng b/FreeFileSync/Build/Languages/portuguese.lng
index 66105d0a..0c26ef2f 100644
--- a/BUILD/Languages/portuguese.lng
+++ b/FreeFileSync/Build/Languages/portuguese.lng
@@ -7,12 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Ambos os lados tiveram alterações desde a última sincronização.</target>
@@ -585,6 +579,9 @@ O comando é executado se:
<source>&Ignore subsequent errors</source>
<target>&Ignorar erros subsequentes</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Erro Grave</target>
@@ -609,6 +606,9 @@ O comando é executado se:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Não é possível encontrar a última versão do FreeFileSync online. Deseja verificar manualmente?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Link Simbólico</target>
diff --git a/BUILD/Languages/portuguese_br.lng b/FreeFileSync/Build/Languages/portuguese_br.lng
index 56a5cb8d..f58606f8 100644
--- a/BUILD/Languages/portuguese_br.lng
+++ b/FreeFileSync/Build/Languages/portuguese_br.lng
@@ -7,9 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Ambos os lados foram alterados desde a última sincronização.</target>
@@ -61,9 +58,6 @@
<source>Cannot open file %x.</source>
<target>Não foi possível abrir o arquivo %x.</target>
-<source>Error</source>
-<target>Erro</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>O arquivo %x não contém uma configuração válida.</target>
@@ -73,12 +67,12 @@
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>O arquivo de configuração não deve conter configurações de diretórios quando os diretórios são definidos via linha de comando.</target>
-<source>Warning</source>
-<target>Avisos</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Os diretórios não podem ser definidos para mais de um arquivo de configuração.</target>
+<source>Command line</source>
+<target>Linha de comando</target>
+
<source>Syntax:</source>
<target>Sintaxe:</target>
@@ -94,9 +88,6 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>Qualquer número de alternativas de diretórios para pelo menos um arquivo de configuração.</target>
-<source>Command line</source>
-<target>Linha de comando</target>
-
<source>A folder input field is empty.</source>
<target>Um campo de entrada de pasta está vazio.</target>
@@ -408,18 +399,12 @@ O comando é disparado se:
<source>&Start</source>
<target>&Iniciar</target>
-<source>&Retry</source>
-<target>&Tentar Novamente</target>
-
-<source>Cancel</source>
-<target>Cancelar</target>
+<source>About</source>
+<target>Sobre</target>
<source>Build: %x</source>
<target>Versão: %x</target>
-<source>About</source>
-<target>Sobre</target>
-
<source>All files</source>
<target>Todos os arquivos</target>
@@ -432,6 +417,9 @@ O comando é disparado se:
<source>Waiting until all directories are available...</source>
<target>Aguardando até todos os diretórios estarem disponíveis...</target>
+<source>Error</source>
+<target>Erro</target>
+
<source>&Restore</source>
<target>&Restaurar</target>
@@ -444,6 +432,9 @@ O comando é disparado se:
<source>Incorrect command line:</source>
<target>Linha de comando incorreta:</target>
+<source>&Retry</source>
+<target>&Tentar Novamente</target>
+
<source>File content</source>
<target>Conteúdo do arquivo</target>
@@ -564,6 +555,15 @@ O comando é disparado se:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Você pode alternar para a janela principal do FreeFileSync para resolver este problema.</target>
+<source>&Don't show this warning again</source>
+<target>&Não mostrar este aviso novamente</target>
+
+<source>&Ignore</source>
+<target>&Ignorar</target>
+
+<source>&Switch</source>
+<target>&Alterar</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Mudando para a janela principal do FreeFileSync</target>
@@ -576,30 +576,39 @@ O comando é disparado se:
<pluralform>Nova tentativa autompatica em %x segundos...</pluralform>
</target>
+<source>&Ignore subsequent errors</source>
+<target>&Ignorar erros subsequentes</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>Erro Grave</target>
+
+<source>Check for Program Updates</source>
+<target>Verificar se existem atualizações</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Uma nova versão do FreeFileSync está disponível:</target>
<source>Download now?</source>
<target>Baixar agora?</target>
-<source>Check for Program Updates</source>
-<target>Verificar se existem atualizações</target>
-
<source>&Download</source>
<target>&Baixar</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync está atualizado.</target>
-<source>Information</source>
-<target>Informação</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Não foi possível conectar a sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Não foi possível encontrar a versão atual do FreeFileSync online. Deseja verificar manualmente?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Link Simbólico</target>
@@ -729,6 +738,9 @@ O comando é disparado se:
<source>Compare</source>
<target>Comparar</target>
+<source>Cancel</source>
+<target>Cancelar</target>
+
<source>Synchronize</source>
<target>Sincronizar</target>
@@ -1074,6 +1086,9 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Start synchronization</source>
<target>Iniciar a sincronização</target>
+<source>Confirm</source>
+<target>Confirmar</target>
+
<source>
<pluralform>Do you really want to execute the command %y for one item?</pluralform>
<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
@@ -1083,9 +1098,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<pluralform>Você realmente deseja executar o comando %y para %x itens?</pluralform>
</target>
-<source>Confirm</source>
-<target>Confirmar</target>
-
<source>&Execute</source>
<target>&Executar</target>
@@ -1179,12 +1191,12 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Do you want to save changes to %x?</source>
<target>Gostaria de salvar as alterações para %x?</target>
-<source>Do&n't save</source>
-<target>&Não salvar</target>
-
<source>Never save &changes</source>
<target>Nunca salvar as &modificações</target>
+<source>Do&n't save</source>
+<target>&Não salvar</target>
+
<source>Filter</source>
<target>Filtro</target>
@@ -1254,27 +1266,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Searching for program updates...</source>
<target>Procurando atualizações do programa...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Ignorar erros subsequentes</target>
-
-<source>&Ignore</source>
-<target>&Ignorar</target>
-
-<source>Serious Error</source>
-<target>Erro Grave</target>
-
-<source>&Don't show this warning again</source>
-<target>&Não mostrar este aviso novamente</target>
-
-<source>&Switch</source>
-<target>&Alterar</target>
-
-<source>&Yes</source>
-<target>&Sim</target>
-
-<source>&No</source>
-<target>&Não</target>
-
<source>Scanning...</source>
<target>Pesquisando...</target>
@@ -1284,6 +1275,9 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Info</source>
<target>Informações</target>
+<source>Warning</source>
+<target>Avisos</target>
+
<source>Paused</source>
<target>Pausado</target>
diff --git a/BUILD/Languages/romanian.lng b/FreeFileSync/Build/Languages/romanian.lng
index b16b7db7..10ca0b53 100644
--- a/BUILD/Languages/romanian.lng
+++ b/FreeFileSync/Build/Languages/romanian.lng
@@ -7,26 +7,6 @@
<plural_definition>n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Ambele părți s-au modificat de la ultima sincronizare.</target>
@@ -422,12 +402,6 @@ Comanda este declanșată dacă:
<source>&Start</source>
<target>&Pornește</target>
-<source>&Retry</source>
-<target>&Reîncearcă</target>
-
-<source>Cancel</source>
-<target>Anulează</target>
-
<source>About</source>
<target>Despre</target>
@@ -461,6 +435,9 @@ Comanda este declanșată dacă:
<source>Incorrect command line:</source>
<target>Linie de comandă incorectă:</target>
+<source>&Retry</source>
+<target>&Reîncearcă</target>
+
<source>File content</source>
<target>Conținutul Filelor</target>
@@ -593,12 +570,22 @@ Comanda este declanșată dacă:
<source>Switching to FreeFileSync's main window</source>
<target>Comut la fereastra principală FreeFileSync</target>
-<source>Serious Error</source>
-<target>Eroare Serioasă</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
<source>&Ignore subsequent errors</source>
<target>&Ignoră erorile ulterioare</target>
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>Eroare Serioasă</target>
+
<source>Check for Program Updates</source>
<target>Caută Actualizări ale Programului</target>
@@ -620,6 +607,9 @@ Comanda este declanșată dacă:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Nu pot afla numărul versiunii FreeFileSync disponibile acum pe internet. Vrei să-l cauți manual?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Simlegătură</target>
@@ -749,6 +739,9 @@ Comanda este declanșată dacă:
<source>Compare</source>
<target>Compară</target>
+<source>Cancel</source>
+<target>Anulează</target>
+
<source>Synchronize</source>
<target>Sincronizează</target>
@@ -836,8 +829,8 @@ Comanda este declanșată dacă:
<source>Delete or overwrite files permanently</source>
<target>Filele sînt șterse sau suprascrise în mod definitiv, fără a mai putea fi recuperate</target>
-<source>&Recycle bin</source>
-<target>&Reciclator</target>
+<source>Recycle bin</source>
+<target></target>
<source>Back up deleted and overwritten files in the recycle bin</source>
<target>Conservă [back up] în Reciclator filele șterse sau suprascrise</target>
@@ -932,6 +925,9 @@ Comanda este declanșată dacă:
<source>How can I schedule a batch job?</source>
<target>Cum pot planifica o sarcină set?</target>
+<source>&Recycle bin</source>
+<target>&Reciclator</target>
+
<source>Delete on both sides</source>
<target>Șterge din ambele părți</target>
@@ -1094,6 +1090,13 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Confirm</source>
<target>Confirmă</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Execută</target>
diff --git a/BUILD/Languages/russian.lng b/FreeFileSync/Build/Languages/russian.lng
index 5735f4f3..5c138a10 100644
--- a/BUILD/Languages/russian.lng
+++ b/FreeFileSync/Build/Languages/russian.lng
@@ -7,26 +7,6 @@
<plural_definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<11 || n%100>14) ? 1 : 2</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Со времени последней синхронизации с обеих сторон произошли изменения.</target>
@@ -596,9 +576,19 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>Переключение на главное окно FreeFileSync</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
<source>&Ignore subsequent errors</source>
<target>И&гнорировать последующие ошибки</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Серьезная ошибка</target>
@@ -623,6 +613,9 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Невозможно найти номер текущей версии FreeFileSync онлайн! Вы хотите проверить вручную?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Символьная ссылка</target>
@@ -842,8 +835,8 @@ The command is triggered if:
<source>Delete or overwrite files permanently</source>
<target>Удалять или перезаписывать файлы, не помещая в "Корзину"</target>
-<source>&Recycle bin</source>
-<target>В "&Корзину"</target>
+<source>Recycle bin</source>
+<target></target>
<source>Back up deleted and overwritten files in the recycle bin</source>
<target>Делать резервную копию удаленных и перезаписанных файлов в "Корзине"</target>
@@ -942,6 +935,9 @@ The command is triggered if:
<source>How can I schedule a batch job?</source>
<target>Как запланировать пакетное задание?</target>
+<source>&Recycle bin</source>
+<target>В "&Корзину"</target>
+
<source>Delete on both sides</source>
<target>Удалить с обеих сторон</target>
@@ -1104,6 +1100,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>Подтвердить</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Выполнить</target>
diff --git a/BUILD/Languages/scottish_gaelic.lng b/FreeFileSync/Build/Languages/scottish_gaelic.lng
index e7ded4f7..906969cb 100644
--- a/BUILD/Languages/scottish_gaelic.lng
+++ b/FreeFileSync/Build/Languages/scottish_gaelic.lng
@@ -7,12 +7,6 @@
<plural_definition>(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3</plural_definition>
</header>
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Chaidh an dà thaobh atharrachadh on t-sioncronachadh mu dheireadh.</target>
@@ -593,6 +587,9 @@ Thèid an loidhne-àithne a chur gu dol:
<source>&Ignore subsequent errors</source>
<target>Le&ig seachad mearachdan às a dhèidh seo</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Mearachd mhòr</target>
@@ -617,6 +614,9 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Chan urrainn dhuinn àireamh an tionndaidh làithrich aig FreeFileSync a lorg air loidhne. A bheil thu airson sùil a thoirt thu fhèin?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Symlink</target>
diff --git a/BUILD/Languages/serbian.lng b/FreeFileSync/Build/Languages/serbian.lng
index 679cfbe1..952cce1c 100644
--- a/BUILD/Languages/serbian.lng
+++ b/FreeFileSync/Build/Languages/serbian.lng
@@ -7,12 +7,6 @@
<plural_definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural_definition>
</header>
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Обе су стране промењене од последње синхронизације.</target>
@@ -589,6 +583,9 @@ The command is triggered if:
<source>&Ignore subsequent errors</source>
<target>&Занемари грешке које даље следе</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Озбиљна грешка</target>
@@ -613,8 +610,8 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Не могу на мрежи пронаћи тренутни број верзије FreeFileSync-а. Да ли желите да проверите ручно?</target>
-<source>Copy</source>
-<target>Копирај</target>
+<source>&Check</source>
+<target></target>
<source>Symlink</source>
<target>Сим-веза</target>
@@ -688,6 +685,9 @@ The command is triggered if:
<source>Clear filter settings</source>
<target>Уклони подешавања филтера</target>
+<source>Copy</source>
+<target>Копирај</target>
+
<source>Paste</source>
<target>Залепи</target>
diff --git a/BUILD/Languages/slovenian.lng b/FreeFileSync/Build/Languages/slovenian.lng
index 6591bc68..92f38be4 100644
--- a/BUILD/Languages/slovenian.lng
+++ b/FreeFileSync/Build/Languages/slovenian.lng
@@ -7,19 +7,6 @@
<plural_definition>n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Obe strani sta se spremenili od zadnje sinhronizacije.</target>
@@ -600,6 +587,9 @@ Ukaz se sproži če:
<source>&Ignore subsequent errors</source>
<target>&Ignoriraj nadaljnje napake</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Resna napaka</target>
@@ -624,6 +614,9 @@ Ukaz se sproži če:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Na omrežju ne najdem obstoječe verzije FreeFileSync-a. Ali želite preveriti lastnoročno?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Simbolična povezava</target>
@@ -1104,6 +1097,13 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Confirm</source>
<target>Potrdi</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Izvedi</target>
diff --git a/BUILD/Languages/spanish.lng b/FreeFileSync/Build/Languages/spanish.lng
index e5ae052c..0ad717bf 100644
--- a/BUILD/Languages/spanish.lng
+++ b/FreeFileSync/Build/Languages/spanish.lng
@@ -7,12 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Ambos lados han cambiado desde la última sincronización.</target>
@@ -585,6 +579,9 @@ El comando es disparado si:
<source>&Ignore subsequent errors</source>
<target>&Ignorar errores posteriores</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Error grave</target>
@@ -609,6 +606,9 @@ El comando es disparado si:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>No se encuentra el número de versión actual de FreeFileSync en línea. ¿Desea comprobarla manualmente?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Enlace simbólico</target>
diff --git a/BUILD/Languages/swedish.lng b/FreeFileSync/Build/Languages/swedish.lng
index 38c590ff..f6cebeab 100644
--- a/BUILD/Languages/swedish.lng
+++ b/FreeFileSync/Build/Languages/swedish.lng
@@ -7,23 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>Retrying operation</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Bägge sidor har ändrats sedan senaste synkroniseringen.</target>
@@ -75,9 +58,6 @@
<source>Cannot open file %x.</source>
<target>Kan inte öppna %x</target>
-<source>Error</source>
-<target>Fel</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x innehåller ingen giltig konfiguration.</target>
@@ -87,12 +67,12 @@
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Konfigurationsfilen kan inte innehålla inställningar på katalogparnivå när mappar anges via kommandorad.</target>
-<source>Warning</source>
-<target>Varning</target>
-
<source>Directories cannot be set for more than one configuration file.</source>
<target>Mappar kan inte anges för mer än en konfigurationsfil</target>
+<source>Command line</source>
+<target>Kommandofält</target>
+
<source>Syntax:</source>
<target>Syntax:</target>
@@ -108,9 +88,6 @@
<source>Any number of alternative directories for at most one config file.</source>
<target>Valfritt antal alternativa mappar för max en konfigurationsfil.</target>
-<source>Command line</source>
-<target>Kommandofält</target>
-
<source>A folder input field is empty.</source>
<target>Ett inmatningsfält är tomt</target>
@@ -422,18 +399,12 @@ Kommandot triggas om:
<source>&Start</source>
<target>&Start</target>
-<source>&Retry</source>
-<target>&Försök igen</target>
-
-<source>Cancel</source>
-<target>Avbryt</target>
+<source>About</source>
+<target>Om</target>
<source>Build: %x</source>
<target>Bygge: %x</target>
-<source>About</source>
-<target>Om</target>
-
<source>All files</source>
<target>Alla filer</target>
@@ -446,6 +417,9 @@ Kommandot triggas om:
<source>Waiting until all directories are available...</source>
<target>Väntar på att samtliga mappar skall bli tillgängliga...</target>
+<source>Error</source>
+<target>Fel</target>
+
<source>&Restore</source>
<target>&Återställ</target>
@@ -458,6 +432,9 @@ Kommandot triggas om:
<source>Incorrect command line:</source>
<target>Felaktig kommandorad:</target>
+<source>&Retry</source>
+<target>&Försök igen</target>
+
<source>File content</source>
<target>Filinnehåll</target>
@@ -578,33 +555,58 @@ Kommandot triggas om:
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Du kan växla till FreeFileSyncs programfönster för att lösa problemet.</target>
+<source>&Don't show this warning again</source>
+<target>&Visa inte den här varningen igen</target>
+
+<source>&Ignore</source>
+<target>&Ignorera</target>
+
+<source>&Switch</source>
+<target>&Växla</target>
+
<source>Switching to FreeFileSync's main window</source>
<target>Växla till FreeFileSyncs programfönster</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
+<source>&Ignore subsequent errors</source>
+<target>&Ignorera efterföljande fel</target>
+
+<source>Retrying operation...</source>
+<target></target>
+
+<source>Serious Error</source>
+<target>Allvarligt fel</target>
+
+<source>Check for Program Updates</source>
+<target>Sök efter programuppdateringar</target>
+
<source>A new version of FreeFileSync is available:</source>
<target>Det finns en ny version av FreeFileSync</target>
<source>Download now?</source>
<target>Ladda ner nu?</target>
-<source>Check for Program Updates</source>
-<target>Sök efter programuppdateringar</target>
-
<source>&Download</source>
<target>&Ladda ner</target>
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync är uppdaterad.</target>
-<source>Information</source>
-<target>Information</target>
-
<source>Unable to connect to sourceforge.net.</source>
<target>Kan inte ansluta sourceforge.net.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Kan inte hitta aktuellt versionsnummer online. Vill du kontrollera manuellt?</target>
+<source>&Check</source>
+<target></target>
+
<source>Symlink</source>
<target>Symboliska länkar</target>
@@ -734,6 +736,9 @@ Kommandot triggas om:
<source>Compare</source>
<target>Jämför</target>
+<source>Cancel</source>
+<target>Avbryt</target>
+
<source>Synchronize</source>
<target>Synkronisera</target>
@@ -1082,6 +1087,13 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Confirm</source>
<target>Bekräfta</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Kör</target>
@@ -1175,12 +1187,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Do you want to save changes to %x?</source>
<target>Vill du spara ändringar till %x?</target>
-<source>Do&n't save</source>
-<target>Spara &inte</target>
-
<source>Never save &changes</source>
<target>Spara aldrig &ändringar</target>
+<source>Do&n't save</source>
+<target>Spara &inte</target>
+
<source>Filter</source>
<target>Filter</target>
@@ -1250,27 +1262,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Searching for program updates...</source>
<target>Söker efter programuppdateringar...</target>
-<source>&Ignore subsequent errors</source>
-<target>&Ignorera efterföljande fel</target>
-
-<source>&Ignore</source>
-<target>&Ignorera</target>
-
-<source>Serious Error</source>
-<target>Allvarligt fel</target>
-
-<source>&Don't show this warning again</source>
-<target>&Visa inte den här varningen igen</target>
-
-<source>&Switch</source>
-<target>&Växla</target>
-
-<source>&Yes</source>
-<target>&Ja</target>
-
-<source>&No</source>
-<target>&Nej</target>
-
<source>Scanning...</source>
<target>Skannar...</target>
@@ -1280,6 +1271,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Info</source>
<target>Info</target>
+<source>Warning</source>
+<target>Varning</target>
+
<source>Paused</source>
<target>Pausad</target>
diff --git a/BUILD/Languages/ukrainian.lng b/FreeFileSync/Build/Languages/ukrainian.lng
index 539524e0..af819d76 100644
--- a/BUILD/Languages/ukrainian.lng
+++ b/FreeFileSync/Build/Languages/ukrainian.lng
@@ -7,26 +7,6 @@
<plural_definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural_definition>
</header>
-<source>
-<pluralform>Do you really want to execute the command %y for one item?</pluralform>
-<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
-</source>
-<target>
-</target>
-
-<source>&Check</source>
-<target></target>
-
-<source>Retrying operation...</source>
-<target></target>
-
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-</target>
-
<source>Both sides have changed since last synchronization.</source>
<target>З моменту останньої синхронізації з обох сторін відбулися зміни.</target>
@@ -593,9 +573,19 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>Перехід до головного вікна FreeFileSync</target>
+<source>
+<pluralform>Automatic retry in 1 second...</pluralform>
+<pluralform>Automatic retry in %x seconds...</pluralform>
+</source>
+<target>
+</target>
+
<source>&Ignore subsequent errors</source>
<target>&Ігнорувати наступні помилки</target>
+<source>Retrying operation...</source>
+<target></target>
+
<source>Serious Error</source>
<target>Серйозна помилка</target>
@@ -620,11 +610,8 @@ The command is triggered if:
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Не вдається знайти номер поточної версії FreeFileSync онлайн. Бажаєте перевірити вручну?</target>
-<source>Last session</source>
-<target>Остання сесія</target>
-
-<source>Copy</source>
-<target>Копіювати</target>
+<source>&Check</source>
+<target></target>
<source>Symlink</source>
<target>Символьне посилання</target>
@@ -698,6 +685,9 @@ The command is triggered if:
<source>Clear filter settings</source>
<target>Очистити налаштування фільтра</target>
+<source>Copy</source>
+<target>Копіювати</target>
+
<source>Paste</source>
<target>Вклеїти</target>
@@ -1103,6 +1093,13 @@ This guarantees a consistent state even in case of a serious error.
<source>Confirm</source>
<target>Підтвердити</target>
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+</target>
+
<source>&Execute</source>
<target>&Виконати</target>
@@ -1184,6 +1181,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Show "%x"</source>
<target>Показати "%x"</target>
+<source>Last session</source>
+<target>Остання сесія</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Порівнювання та Синхронізація папок</target>
diff --git a/BUILD/Resources.zip b/FreeFileSync/Build/Resources.zip
index f5e1c651..ee52f047 100644
--- a/BUILD/Resources.zip
+++ b/FreeFileSync/Build/Resources.zip
Binary files differ
diff --git a/BUILD/Sync_Complete.wav b/FreeFileSync/Build/Sync_Complete.wav
index 96dd2a15..96dd2a15 100644
--- a/BUILD/Sync_Complete.wav
+++ b/FreeFileSync/Build/Sync_Complete.wav
Binary files differ
diff --git a/BUILD/styles.gtk_rc b/FreeFileSync/Build/styles.gtk_rc
index c6b1b5ab..c6b1b5ab 100644
--- a/BUILD/styles.gtk_rc
+++ b/FreeFileSync/Build/styles.gtk_rc
diff --git a/FreeFileSync.vcxproj b/FreeFileSync/Source/FreeFileSync.vcxproj
index abe818b1..cba18010 100644
--- a/FreeFileSync.vcxproj
+++ b/FreeFileSync/Source/FreeFileSync.vcxproj
@@ -52,8 +52,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -66,58 +64,54 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
- <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <OutDir>BUILD\Bin\</OutDir>
- <IntDir>OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\Build\Bin\</OutDir>
+ <IntDir>..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <OutDir>BUILD\Bin\</OutDir>
- <IntDir>OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\Build\Bin\</OutDir>
+ <IntDir>..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>BUILD\Bin\</OutDir>
- <IntDir>OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\Build\Bin\</OutDir>
+ <IntDir>..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>BUILD\Bin\</OutDir>
- <IntDir>OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\Build\Bin\</OutDir>
+ <IntDir>..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
- <RunCodeAnalysis>false</RunCodeAnalysis>
+ <LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll\mswud;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll\mswud</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>wx+/pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4512</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PrecompiledHeaderOutputFile>$(IntDir)pch.obj</PrecompiledHeaderOutputFile>
<ForcedIncludeFiles>zen/warn_static.h;wx+/pch.h</ForcedIncludeFiles>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <MinimalRebuild>false</MinimalRebuild>
<SmallerTypeCheck>true</SmallerTypeCheck>
+ <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+ <MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalDependencies>wxmsw29ud_aui.lib;wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud_net.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies);Wininet.lib</AdditionalDependencies>
+ <AdditionalDependencies>Rpcrt4.lib;winmm.lib;comctl32.lib;Wininet.lib;wxmsw29ud_aui.lib;wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud_net.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll</AdditionalLibraryDirectories>
- <LinkStatus>
- </LinkStatus>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories>
@@ -129,29 +123,22 @@
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll\mswud;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll\mswud</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>wx+/pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4512</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PrecompiledHeaderOutputFile>$(IntDir)pch.obj</PrecompiledHeaderOutputFile>
<ForcedIncludeFiles>zen/warn_static.h;wx+/pch.h</ForcedIncludeFiles>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <MinimalRebuild>false</MinimalRebuild>
<SmallerTypeCheck>true</SmallerTypeCheck>
- <ShowIncludes>false</ShowIncludes>
+ <MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalDependencies>wxbase29ud.lib;wxmsw29ud_core.lib;wxmsw29ud_adv.lib;wxmsw29ud_aui.lib;wxbase29ud_net.lib;wxpngd.lib;wxzlibd.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies);Wininet.lib</AdditionalDependencies>
+ <AdditionalDependencies>Rpcrt4.lib;winmm.lib;comctl32.lib;Wininet.lib;wxmsw29ud_aui.lib;wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud_net.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll</AdditionalLibraryDirectories>
- <LinkStatus>
- </LinkStatus>
- <ManifestFile>
- </ManifestFile>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories>
@@ -161,27 +148,21 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib\mswu;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib\mswu</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4512;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<ForcedIncludeFiles>zen/warn_static.h</ForcedIncludeFiles>
+ <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>false</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalDependencies>wxmsw29u_aui.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies);Wininet.lib</AdditionalDependencies>
+ <AdditionalDependencies>Rpcrt4.lib;winmm.lib;comctl32.lib;Wininet.lib;wxmsw29u_aui.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib</AdditionalLibraryDirectories>
- <LinkStatus>
- </LinkStatus>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories>
@@ -194,28 +175,21 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib\mswu;.</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib\mswu</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4512;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<ForcedIncludeFiles>zen/warn_static.h</ForcedIncludeFiles>
- <EnablePREfast>false</EnablePREfast>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalDependencies>wxmsw29u_aui.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies);Wininet.lib</AdditionalDependencies>
+ <AdditionalDependencies>Rpcrt4.lib;winmm.lib;comctl32.lib;Wininet.lib;wxmsw29u_aui.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib</AdditionalLibraryDirectories>
- <LinkStatus>
- </LinkStatus>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories>
@@ -226,6 +200,31 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="..\..\wx+\create_pch.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="..\..\wx+\graph.cpp" />
+ <ClCompile Include="..\..\wx+\grid.cpp" />
+ <ClCompile Include="..\..\wx+\image_resources.cpp" />
+ <ClCompile Include="..\..\wx+\image_tools.cpp" />
+ <ClCompile Include="..\..\wx+\mouse_move_dlg.cpp" />
+ <ClCompile Include="..\..\wx+\popup_dlg.cpp" />
+ <ClCompile Include="..\..\wx+\popup_dlg_generated.cpp" />
+ <ClCompile Include="..\..\wx+\tooltip.cpp" />
+ <ClCompile Include="..\..\wx+\zlib_wrap.cpp" />
+ <ClCompile Include="..\..\zenXml\zenxml\unit_test.cpp" />
+ <ClCompile Include="..\..\zen\debug_memory_leaks.cpp" />
+ <ClCompile Include="..\..\zen\dst_hack.cpp" />
+ <ClCompile Include="..\..\zen\file_handling.cpp" />
+ <ClCompile Include="..\..\zen\file_io.cpp" />
+ <ClCompile Include="..\..\zen\file_traverser.cpp" />
+ <ClCompile Include="..\..\zen\format_unit.cpp" />
+ <ClCompile Include="..\..\zen\privilege.cpp" />
+ <ClCompile Include="..\..\zen\process_priority.cpp" />
+ <ClCompile Include="..\..\zen\recycler.cpp" />
+ <ClCompile Include="..\..\zen\scroll_window_under_cursor.cpp" />
+ <ClCompile Include="..\..\zen\zstring.cpp" />
<ClCompile Include="algorithm.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Use</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Use</PrecompiledHeader>
@@ -269,43 +268,15 @@
<ClCompile Include="ui\tray_icon.cpp" />
<ClCompile Include="ui\tree_view.cpp" />
<ClCompile Include="ui\triple_splitter.cpp" />
- <ClCompile Include="wx+\create_pch.cpp">
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
- </ClCompile>
- <ClCompile Include="wx+\graph.cpp" />
- <ClCompile Include="wx+\grid.cpp" />
- <ClCompile Include="wx+\image_resources.cpp" />
- <ClCompile Include="wx+\image_tools.cpp" />
- <ClCompile Include="wx+\mouse_move_dlg.cpp" />
- <ClCompile Include="wx+\popup_dlg.cpp" />
- <ClCompile Include="wx+\popup_dlg_generated.cpp" />
- <ClCompile Include="wx+\tooltip.cpp" />
- <ClCompile Include="wx+\zlib_wrap.cpp" />
- <ClCompile Include="zenxml\unit_test.cpp" />
- <ClCompile Include="zen\debug_memory_leaks.cpp" />
- <ClCompile Include="zen\dst_hack.cpp" />
- <ClCompile Include="zen\file_handling.cpp" />
- <ClCompile Include="zen\file_id.cpp" />
- <ClCompile Include="zen\file_io.cpp" />
- <ClCompile Include="zen\file_traverser.cpp" />
- <ClCompile Include="zen\format_unit.cpp" />
- <ClCompile Include="zen\privilege.cpp" />
- <ClCompile Include="zen\process_priority.cpp" />
- <ClCompile Include="zen\recycler.cpp" />
- <ClCompile Include="zen\scroll_window_under_cursor.cpp" />
- <ClCompile Include="zen\zstring.cpp" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="resource.rc" />
</ItemGroup>
<ItemGroup>
+ <None Include="..\..\wx+\PopupDialog.fbp" />
<None Include="FreeFileSync.fbp">
<SubType>Designer</SubType>
</None>
- <None Include="wx+\PopupDialog.fbp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/FreeFileSync/Source/LICENSE b/FreeFileSync/Source/LICENSE
new file mode 100644
index 00000000..94a04532
--- /dev/null
+++ b/FreeFileSync/Source/LICENSE
@@ -0,0 +1,621 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
diff --git a/Makefile b/FreeFileSync/Source/Makefile
index 49bb22a4..919328f2 100644
--- a/Makefile
+++ b/FreeFileSync/Source/Makefile
@@ -7,7 +7,7 @@ SHAREDIR = $(DESTDIR)$(prefix)/share
APPSHAREDIR = $(SHAREDIR)/$(APPNAME)
DOCSHAREDIR = $(SHAREDIR)/doc/$(APPNAME)
-CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DwxUSE_UNICODE -DWXINTL_NO_GETTEXT_MACRO -I. -include "zen/i18n.h" -include "zen/warn_static.h"
+CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h"
LINKFLAGS =
#distinguish Linux/OSX builds
@@ -110,22 +110,21 @@ CPP_LIST+=lib/status_handler.cpp
CPP_LIST+=lib/versioning.cpp
CPP_LIST+=lib/ffs_paths.cpp
CPP_LIST+=lib/xml_base.cpp
-CPP_LIST+=zen/recycler.cpp
-CPP_LIST+=zen/file_handling.cpp
-CPP_LIST+=zen/file_id.cpp
-CPP_LIST+=zen/file_io.cpp
-CPP_LIST+=zen/file_traverser.cpp
-CPP_LIST+=zen/zstring.cpp
-CPP_LIST+=zen/format_unit.cpp
-CPP_LIST+=zen/process_priority.cpp
-CPP_LIST+=wx+/grid.cpp
-CPP_LIST+=wx+/image_tools.cpp
-CPP_LIST+=wx+/graph.cpp
-CPP_LIST+=wx+/tooltip.cpp
-CPP_LIST+=wx+/image_resources.cpp
-CPP_LIST+=wx+/popup_dlg.cpp
-CPP_LIST+=wx+/popup_dlg_generated.cpp
-CPP_LIST+=wx+/zlib_wrap.cpp
+CPP_LIST+=../../zen/recycler.cpp
+CPP_LIST+=../../zen/file_handling.cpp
+CPP_LIST+=../../zen/file_io.cpp
+CPP_LIST+=../../zen/file_traverser.cpp
+CPP_LIST+=../../zen/zstring.cpp
+CPP_LIST+=../../zen/format_unit.cpp
+CPP_LIST+=../../zen/process_priority.cpp
+CPP_LIST+=../../wx+/grid.cpp
+CPP_LIST+=../../wx+/image_tools.cpp
+CPP_LIST+=../../wx+/graph.cpp
+CPP_LIST+=../../wx+/tooltip.cpp
+CPP_LIST+=../../wx+/image_resources.cpp
+CPP_LIST+=../../wx+/popup_dlg.cpp
+CPP_LIST+=../../wx+/popup_dlg_generated.cpp
+CPP_LIST+=../../wx+/zlib_wrap.cpp
# OS X
ifeq ($(OPERATING_SYSTEM_NAME), Darwin)
@@ -135,39 +134,39 @@ MM_LIST+=lib/osx_file_icon.mm
endif
#list of all *.o files
-OBJECT_LIST = $(CPP_LIST:%.cpp=OBJ/FFS_GCC_Make_Release/%.o)
-OBJECT_LIST += $(MM_LIST:%.mm=OBJ/FFS_GCC_Make_Release/%.mm.o)
+OBJECT_LIST = $(CPP_LIST:%.cpp=../Obj/FFS_GCC_Make_Release/ffs/src/%.o)
+OBJECT_LIST += $(MM_LIST:%.mm=../Obj/FFS_GCC_Make_Release/ffs/src/%.mm.o)
all: FreeFileSync
-OBJ/FFS_GCC_Make_Release/%.mm.o : %.mm
+../Obj/FFS_GCC_Make_Release/ffs/src/%.mm.o : %.mm
mkdir -p $(dir $@)
$(COMPILER_BIN) $(CXXFLAGS) -c $< -o $@
-OBJ/FFS_GCC_Make_Release/%.o : %.cpp
+../Obj/FFS_GCC_Make_Release/ffs/src/%.o : %.cpp
mkdir -p $(dir $@)
$(COMPILER_BIN) $(CXXFLAGS) -c $< -o $@
FreeFileSync: $(OBJECT_LIST)
- $(COMPILER_BIN) -o ./BUILD/$(APPNAME) $(OBJECT_LIST) $(LINKFLAGS)
+ $(COMPILER_BIN) -o ../Build/$(APPNAME) $(OBJECT_LIST) $(LINKFLAGS)
clean:
- rm -rf OBJ/FFS_GCC_Make_Release
- rm -f BUILD/$(APPNAME)
- rm -f wx+/pch.h.gch
+ rm -rf ../Obj/FFS_GCC_Make_Release
+ rm -f ../Build/$(APPNAME)
+ rm -f ../../wx+/pch.h.gch
install:
mkdir -p $(BINDIR)
- cp BUILD/$(APPNAME) $(BINDIR)
+ cp ../Build/$(APPNAME) $(BINDIR)
mkdir -p $(APPSHAREDIR)
- cp -R BUILD/Languages/ \
- BUILD/Help/ \
- BUILD/Sync_Complete.wav \
- BUILD/Resources.zip \
- BUILD/styles.gtk_rc \
+ cp -R ../Build/Languages/ \
+ ../Build/Help/ \
+ ../Build/Sync_Complete.wav \
+ ../Build/Resources.zip \
+ ../Build/styles.gtk_rc \
$(APPSHAREDIR)
mkdir -p $(DOCSHAREDIR)
- cp BUILD/Changelog.txt $(DOCSHAREDIR)/changelog
+ cp ../Build/Changelog.txt $(DOCSHAREDIR)/changelog
gzip $(DOCSHAREDIR)/changelog
diff --git a/RealtimeSync/makefile b/FreeFileSync/Source/RealtimeSync/Makefile
index 8098d586..3ce0a764 100644
--- a/RealtimeSync/makefile
+++ b/FreeFileSync/Source/RealtimeSync/Makefile
@@ -4,7 +4,7 @@ APPNAME = RealtimeSync
prefix = /usr
BINDIR = $(DESTDIR)$(prefix)/bin
-CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DwxUSE_UNICODE -DWXINTL_NO_GETTEXT_MACRO -I.. -include "zen/i18n.h" -include "zen/warn_static.h"
+CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h"
LINKFLAGS =
#distinguish Linux/Mac builds
@@ -68,34 +68,34 @@ CPP_LIST+=../lib/process_xml.cpp
CPP_LIST+=../lib/resolve_path.cpp
CPP_LIST+=../lib/xml_base.cpp
CPP_LIST+=../lib/ffs_paths.cpp
-CPP_LIST+=../zen/dir_watcher.cpp
-CPP_LIST+=../zen/file_handling.cpp
-CPP_LIST+=../zen/file_io.cpp
-CPP_LIST+=../zen/file_traverser.cpp
-CPP_LIST+=../zen/zstring.cpp
-CPP_LIST+=../zen/format_unit.cpp
-CPP_LIST+=../wx+/image_tools.cpp
-CPP_LIST+=../wx+/image_resources.cpp
-CPP_LIST+=../wx+/popup_dlg.cpp
-CPP_LIST+=../wx+/popup_dlg_generated.cpp
+CPP_LIST+=../../../zen/dir_watcher.cpp
+CPP_LIST+=../../../zen/file_handling.cpp
+CPP_LIST+=../../../zen/file_io.cpp
+CPP_LIST+=../../../zen/file_traverser.cpp
+CPP_LIST+=../../../zen/zstring.cpp
+CPP_LIST+=../../../zen/format_unit.cpp
+CPP_LIST+=../../../wx+/image_tools.cpp
+CPP_LIST+=../../../wx+/image_resources.cpp
+CPP_LIST+=../../../wx+/popup_dlg.cpp
+CPP_LIST+=../../../wx+/popup_dlg_generated.cpp
#list of all *.o files (we need the "RTS" subdirectory to handle "../*.cpp" files
-OBJECT_LIST=$(CPP_LIST:%.cpp=../OBJ/RTS_GCC_Make_Release/RTS/%.o)
+OBJECT_LIST=$(CPP_LIST:%.cpp=../../Obj/RTS_GCC_Make_Release/ffs/src/rts/%.o)
all: RealtimeSync
-../OBJ/RTS_GCC_Make_Release/RTS/%.o : %.cpp
+../../Obj/RTS_GCC_Make_Release/ffs/src/rts/%.o : %.cpp
mkdir -p $(dir $@)
$(COMPILER_BIN) $(CXXFLAGS) -c $< -o $@
RealtimeSync: $(OBJECT_LIST)
- $(COMPILER_BIN) -o ../BUILD/$(APPNAME) $(OBJECT_LIST) $(LINKFLAGS)
+ $(COMPILER_BIN) -o ../../Build/$(APPNAME) $(OBJECT_LIST) $(LINKFLAGS)
clean:
- rm -rf ../OBJ/RTS_GCC_Make_Release
- rm -f ../BUILD/$(APPNAME)
- rm -f ../wx+/pch.h.gch
+ rm -rf ../../Obj/RTS_GCC_Make_Release
+ rm -f ../../Build/$(APPNAME)
+ rm -f ../../../wx+/pch.h.gch
install:
mkdir -p $(BINDIR)
- cp ../BUILD/$(APPNAME) $(BINDIR)
+ cp ../../Build/$(APPNAME) $(BINDIR)
diff --git a/RealtimeSync/RealtimeSync.ico b/FreeFileSync/Source/RealtimeSync/RealtimeSync.ico
index f9012b12..f9012b12 100644
--- a/RealtimeSync/RealtimeSync.ico
+++ b/FreeFileSync/Source/RealtimeSync/RealtimeSync.ico
Binary files differ
diff --git a/RealtimeSync/RealtimeSync.vcxproj b/FreeFileSync/Source/RealtimeSync/RealtimeSync.vcxproj
index 99f64740..9344fb4b 100644
--- a/RealtimeSync/RealtimeSync.vcxproj
+++ b/FreeFileSync/Source/RealtimeSync/RealtimeSync.vcxproj
@@ -52,8 +52,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -66,30 +64,29 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
- <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <OutDir>..\BUILD\Bin\</OutDir>
- <IntDir>..\OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\..\Build\Bin\</OutDir>
+ <IntDir>..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <OutDir>..\BUILD\Bin\</OutDir>
- <IntDir>..\OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\..\Build\Bin\</OutDir>
+ <IntDir>..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>..\BUILD\Bin\</OutDir>
- <IntDir>..\OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\..\Build\Bin\</OutDir>
+ <IntDir>..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>..\BUILD\Bin\</OutDir>
- <IntDir>..\OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir>..\..\Build\Bin\</OutDir>
+ <IntDir>..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
@@ -98,22 +95,22 @@
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll\mswud;..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll\mswud</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>wx+/pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4512</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PrecompiledHeaderOutputFile>$(IntDir)pch.obj</PrecompiledHeaderOutputFile>
<ForcedIncludeFiles>zen/warn_static.h;wx+/pch.h</ForcedIncludeFiles>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <MinimalRebuild>false</MinimalRebuild>
+ <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
<SmallerTypeCheck>true</SmallerTypeCheck>
+ <MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalDependencies>wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>comctl32.lib;wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll</AdditionalLibraryDirectories>
</Link>
<ResourceCompile>
@@ -126,27 +123,23 @@
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll\mswud;..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll\mswud</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>wx+/pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4512</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PrecompiledHeaderOutputFile>$(IntDir)pch.obj</PrecompiledHeaderOutputFile>
<ForcedIncludeFiles>zen/warn_static.h;wx+/pch.h</ForcedIncludeFiles>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <MinimalRebuild>false</MinimalRebuild>
<ShowIncludes>false</ShowIncludes>
<SmallerTypeCheck>true</SmallerTypeCheck>
+ <MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalDependencies>wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>comctl32.lib;wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll</AdditionalLibraryDirectories>
- <LinkStatus>
- </LinkStatus>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories>
@@ -159,20 +152,18 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib\mswu;..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib\mswu</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4512;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<ForcedIncludeFiles>zen/warn_static.h</ForcedIncludeFiles>
+ <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>false</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalDependencies>wxbase29u.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>comctl32.lib;wxmsw29u_adv.lib;wxbase29u_net.lib;wxbase29u.lib;wxmsw29u_core.lib;wxpng.lib;wxzlib.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib</AdditionalLibraryDirectories>
</Link>
@@ -190,8 +181,8 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
- <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib\mswu;..</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\Projects\zenXml;C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib\mswu</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4512;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -200,10 +191,7 @@
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>false</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <AdditionalDependencies>wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalDependencies>comctl32.lib;wxmsw29u_adv.lib;wxbase29u_net.lib;wxbase29u.lib;wxmsw29u_core.lib;wxpng.lib;wxzlib.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib</AdditionalLibraryDirectories>
</Link>
@@ -216,6 +204,26 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="..\..\..\wx+\create_pch.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="..\..\..\wx+\image_resources.cpp" />
+ <ClCompile Include="..\..\..\wx+\image_tools.cpp" />
+ <ClCompile Include="..\..\..\wx+\mouse_move_dlg.cpp" />
+ <ClCompile Include="..\..\..\wx+\popup_dlg.cpp" />
+ <ClCompile Include="..\..\..\wx+\popup_dlg_generated.cpp" />
+ <ClCompile Include="..\..\..\zen\debug_memory_leaks.cpp" />
+ <ClCompile Include="..\..\..\zen\dir_watcher.cpp" />
+ <ClCompile Include="..\..\..\zen\dst_hack.cpp" />
+ <ClCompile Include="..\..\..\zen\file_handling.cpp" />
+ <ClCompile Include="..\..\..\zen\file_io.cpp" />
+ <ClCompile Include="..\..\..\zen\file_traverser.cpp" />
+ <ClCompile Include="..\..\..\zen\format_unit.cpp" />
+ <ClCompile Include="..\..\..\zen\notify_removal.cpp" />
+ <ClCompile Include="..\..\..\zen\privilege.cpp" />
+ <ClCompile Include="..\..\..\zen\scroll_window_under_cursor.cpp" />
+ <ClCompile Include="..\..\..\zen\zstring.cpp" />
<ClCompile Include="..\lib\ffs_paths.cpp" />
<ClCompile Include="..\lib\localization.cpp" />
<ClCompile Include="..\lib\process_xml.cpp" />
@@ -224,26 +232,6 @@
<ClCompile Include="..\structures.cpp" />
<ClCompile Include="..\ui\dir_name.cpp" />
<ClCompile Include="..\ui\folder_history_box.cpp" />
- <ClCompile Include="..\wx+\create_pch.cpp">
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
- </ClCompile>
- <ClCompile Include="..\wx+\image_resources.cpp" />
- <ClCompile Include="..\wx+\image_tools.cpp" />
- <ClCompile Include="..\wx+\mouse_move_dlg.cpp" />
- <ClCompile Include="..\wx+\popup_dlg.cpp" />
- <ClCompile Include="..\wx+\popup_dlg_generated.cpp" />
- <ClCompile Include="..\zen\debug_memory_leaks.cpp" />
- <ClCompile Include="..\zen\dir_watcher.cpp" />
- <ClCompile Include="..\zen\dst_hack.cpp" />
- <ClCompile Include="..\zen\file_handling.cpp" />
- <ClCompile Include="..\zen\file_io.cpp" />
- <ClCompile Include="..\zen\file_traverser.cpp" />
- <ClCompile Include="..\zen\format_unit.cpp" />
- <ClCompile Include="..\zen\notify_removal.cpp" />
- <ClCompile Include="..\zen\privilege.cpp" />
- <ClCompile Include="..\zen\scroll_window_under_cursor.cpp" />
- <ClCompile Include="..\zen\zstring.cpp" />
<ClCompile Include="application.cpp" />
<ClCompile Include="gui_generated.cpp" />
<ClCompile Include="main_dlg.cpp" />
@@ -259,6 +247,4 @@
<None Include="RealtimeSync.fbp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/RealtimeSync/app_icon.h b/FreeFileSync/Source/RealtimeSync/app_icon.h
index fcd2b548..fcd2b548 100644
--- a/RealtimeSync/app_icon.h
+++ b/FreeFileSync/Source/RealtimeSync/app_icon.h
diff --git a/RealtimeSync/application.cpp b/FreeFileSync/Source/RealtimeSync/application.cpp
index a0d693d6..e5bed7f3 100644
--- a/RealtimeSync/application.cpp
+++ b/FreeFileSync/Source/RealtimeSync/application.cpp
@@ -18,7 +18,7 @@
#include "../lib/localization.h"
#include "../lib/ffs_paths.h"
#include "../lib/return_codes.h"
-#include "lib/error_log.h"
+#include "../lib/error_log.h"
#ifdef ZEN_WIN
#include <zen/win_ver.h>
@@ -82,6 +82,9 @@ bool Application::OnInit()
initResourceImages(getResourceDir() + Zstr("Resources.zip"));
+ Connect(wxEVT_QUERY_END_SESSION, wxEventHandler(Application::onQueryEndSession), nullptr, this);
+ Connect(wxEVT_END_SESSION, wxEventHandler(Application::onQueryEndSession), nullptr, this);
+
//do not call wxApp::OnInit() to avoid using default commandline parser
//Note: app start is deferred: -> see FreeFileSync
@@ -170,3 +173,14 @@ int Application::OnRun()
return FFS_RC_SUCCESS; //program's return code
}
+
+
+
+void Application::onQueryEndSession(wxEvent& event)
+{
+ if (auto mainWin = dynamic_cast<MainDialog*>(GetTopWindow()))
+ mainWin->onQueryEndSession();
+ OnExit(); //wxWidgets screws up again: http://trac.wxwidgets.org/ticket/3069
+ //wxEntryCleanup(); -> gives popup "dll init failed" on XP
+ std::exit(FFS_RC_SUCCESS); //Windows will terminate anyway: destruct global objects
+} \ No newline at end of file
diff --git a/RealtimeSync/application.h b/FreeFileSync/Source/RealtimeSync/application.h
index 2edef90c..3752f824 100644
--- a/RealtimeSync/application.h
+++ b/FreeFileSync/Source/RealtimeSync/application.h
@@ -16,6 +16,7 @@ public:
virtual int OnExit();
virtual int OnRun();
virtual bool OnExceptionInMainLoop() { throw; } //just re-throw and avoid display of additional messagebox: it will be caught in OnRun()
+ void onQueryEndSession(wxEvent& event);
private:
void onEnterEventLoop(wxEvent& event);
diff --git a/RealtimeSync/gui_generated.cpp b/FreeFileSync/Source/RealtimeSync/gui_generated.cpp
index 3b3ad3fe..3b3ad3fe 100644
--- a/RealtimeSync/gui_generated.cpp
+++ b/FreeFileSync/Source/RealtimeSync/gui_generated.cpp
diff --git a/RealtimeSync/gui_generated.h b/FreeFileSync/Source/RealtimeSync/gui_generated.h
index a816e10a..a816e10a 100644
--- a/RealtimeSync/gui_generated.h
+++ b/FreeFileSync/Source/RealtimeSync/gui_generated.h
diff --git a/RealtimeSync/main_dlg.cpp b/FreeFileSync/Source/RealtimeSync/main_dlg.cpp
index f29f396b..ee3e7dda 100644
--- a/RealtimeSync/main_dlg.cpp
+++ b/FreeFileSync/Source/RealtimeSync/main_dlg.cpp
@@ -129,8 +129,8 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName)
Show();
#ifdef ZEN_MAC
ProcessSerialNumber psn = { 0, kCurrentProcess };
- ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon, even if we're not an application bundle
+ ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
//if the executable is not yet in a bundle or if it is called through a launcher, we need to set focus manually:
#endif
}
@@ -159,6 +159,13 @@ MainDialog::~MainDialog()
}
+void MainDialog::onQueryEndSession()
+{
+ try { writeRealConfig(getConfiguration(), lastConfigFileName()); } //throw FfsXmlError
+ catch (const xmlAccess::FfsXmlError&) {} //we try our best do to something useful in this extreme situation - no reason to notify or even log errors here!
+}
+
+
void MainDialog::onProcessAsyncTasks(wxEvent& event)
{
//schedule and run long-running tasks asynchronously
@@ -183,19 +190,13 @@ void MainDialog::OnShowHelp(wxCommandEvent& event)
void MainDialog::OnMenuAbout(wxCommandEvent& event)
{
- //build information
wxString build = __TDATE__;
-#if wxUSE_UNICODE
build += L" - Unicode";
-#else
- build += L" - ANSI";
-#endif //wxUSE_UNICODE
+#ifndef wxUSE_UNICODE
+#error what is going on?
+#endif
- //compile time info about 32/64-bit build
- if (zen::is64BitBuild)
- build += L" x64";
- else
- build += L" x86";
+ build += zen::is64BitBuild ? L" x64" : L" x86";
assert_static(zen::is32BitBuild || zen::is64BitBuild);
showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg().
@@ -238,9 +239,9 @@ void MainDialog::OnStart(wxCommandEvent& event)
}
Show(); //don't show for EXIT_APP
#ifdef ZEN_MAC
- ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
//why isn't this covered by wxWindows::Raise()??
::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon again
+ ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
#endif
Raise();
}
@@ -369,8 +370,8 @@ xmlAccess::XmlRealConfig MainDialog::getConfiguration()
xmlAccess::XmlRealConfig output;
output.directories.push_back(utfCvrtTo<Zstring>(dirNameFirst->getName()));
- for (auto it = dirNamesExtra.begin(); it != dirNamesExtra.end(); ++it)
- output.directories.push_back(utfCvrtTo<Zstring>((*it)->getName()));
+ for (const DirectoryPanel* dne : dirNamesExtra)
+ output.directories.push_back(utfCvrtTo<Zstring>(dne->getName()));
output.commandline = utfCvrtTo<Zstring>(m_textCtrlCommand->GetValue());
output.delay = m_spinCtrlDelay->GetValue();
@@ -410,10 +411,7 @@ void MainDialog::OnRemoveTopFolder(wxCommandEvent& event)
{
if (dirNamesExtra.size() > 0)
{
- const wxString topDir = (*dirNamesExtra.begin())->getName();
-
- dirNameFirst->setName(topDir);
-
+ dirNameFirst->setName(dirNamesExtra[0]->getName());
removeAddFolder(0); //remove first of additional folders
}
}
@@ -436,7 +434,7 @@ void MainDialog::addFolder(const std::vector<Zstring>& newFolders, bool addFront
#endif
int folderHeight = 0;
- for (auto it = newFolders.begin(); it != newFolders.end(); ++it)
+ for (const Zstring& dirname : newFolders)
{
//add new folder pair
DirectoryPanel* newFolder = new DirectoryPanel(m_scrolledWinFolders);
@@ -460,7 +458,7 @@ void MainDialog::addFolder(const std::vector<Zstring>& newFolders, bool addFront
newFolder->m_bpButtonRemoveFolder->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolder), nullptr, this );
//insert directory name
- newFolder->setName(utfCvrtTo<wxString>(*it));
+ newFolder->setName(utfCvrtTo<wxString>(dirname));
}
//set size of scrolled window
diff --git a/RealtimeSync/main_dlg.h b/FreeFileSync/Source/RealtimeSync/main_dlg.h
index 9e5537f0..4e6f71b7 100644
--- a/RealtimeSync/main_dlg.h
+++ b/FreeFileSync/Source/RealtimeSync/main_dlg.h
@@ -28,6 +28,8 @@ class MainDialog: public MainDlgGenerated
public:
static void create(const Zstring& cfgFile);
+ void onQueryEndSession(); //last chance to do something useful before killing the application!
+
private:
MainDialog(wxDialog* dlg, const Zstring& cfgFileName);
~MainDialog();
diff --git a/RealtimeSync/monitor.cpp b/FreeFileSync/Source/RealtimeSync/monitor.cpp
index 88536281..23473857 100644
--- a/RealtimeSync/monitor.cpp
+++ b/FreeFileSync/Source/RealtimeSync/monitor.cpp
@@ -24,14 +24,14 @@ namespace
const int CHECK_DIR_INTERVAL = 1; //unit: [s]
-std::vector<Zstring> getFormattedDirs(const std::vector<Zstring>& dirs) //throw FileError
+std::vector<Zstring> getFormattedDirs(const std::vector<Zstring>& dirnamePhrases) //throw FileError
{
- std::set<Zstring, LessFilename> tmp; //make unique
+ std::set<Zstring, LessFilename> dirnames; //make unique
+ for (const Zstring& phrase : std::set<Zstring, LessFilename>(dirnamePhrases.begin(), dirnamePhrases.end()))
+ //make unique: no need to resolve duplicate phrases more than once! (consider "[volume name]" syntax) -> shouldn't this be already buffered by OS?
+ dirnames.insert(getFormattedDirectoryName(phrase));
- std::transform(dirs.begin(), dirs.end(), std::inserter(tmp, tmp.end()),
- [](const Zstring& dirnameNonFmt) { return getFormattedDirectoryName(dirnameNonFmt); });
-
- return std::vector<Zstring>(tmp.begin(), tmp.end());
+ return std::vector<Zstring>(dirnames.begin(), dirnames.end());
}
@@ -53,19 +53,18 @@ struct WaitResult
};
-WaitResult waitForChanges(const std::vector<Zstring>& dirNamesNonFmt, //throw FileError
+WaitResult waitForChanges(const std::vector<Zstring>& dirnamePhrases, //throw FileError
const std::function<void(bool)>& onRefreshGui) //bool: readyForSync
{
- const std::vector<Zstring> dirNamesFmt = getFormattedDirs(dirNamesNonFmt); //throw FileError
+ const std::vector<Zstring> dirNamesFmt = getFormattedDirs(dirnamePhrases); //throw FileError
if (dirNamesFmt.empty()) //pathological case, but we have to check else this function will wait endlessly
throw zen::FileError(_("A folder input field is empty.")); //should have been checked by caller!
//detect when volumes are removed/are not available anymore
std::vector<std::pair<Zstring, std::shared_ptr<DirWatcher>>> watches;
- for (auto it = dirNamesFmt.begin(); it != dirNamesFmt.end(); ++it)
+ for (const Zstring& dirnameFmt : dirNamesFmt)
{
- const Zstring& dirnameFmt = *it;
try
{
//a non-existent network path may block, so check existence asynchronously!
@@ -148,18 +147,15 @@ WaitResult waitForChanges(const std::vector<Zstring>& dirNamesNonFmt, //throw Fi
//wait until all directories become available (again) + logs in network share
-void waitForMissingDirs(const std::vector<Zstring>& dirNamesNonFmt, //throw FileError
+void waitForMissingDirs(const std::vector<Zstring>& dirnamePhrases, //throw FileError
const std::function<void(const Zstring&)>& onRefreshGui) //Zstring: the directory that is currently being waited for
{
while (true)
{
- //support specifying volume by name => call getFormattedDirectoryName() repeatedly
- const std::vector<Zstring>& dirNamesFmt = getFormattedDirs(dirNamesNonFmt); //throw FileError
-
bool allExisting = true;
- for (auto it = dirNamesFmt.begin(); it != dirNamesFmt.end(); ++it)
+ //support specifying volume by name => call getFormattedDirectoryName() repeatedly
+ for (const Zstring& dirnameFmt : getFormattedDirs(dirnamePhrases)) //throw FileError
{
- const Zstring dirnameFmt = *it;
auto ftDirExisting = async([=]() -> bool
{
#ifdef ZEN_WIN
@@ -211,9 +207,9 @@ struct ExecCommandNowException {};
}
-void rts::monitorDirectories(const std::vector<Zstring>& dirNamesNonFmt, unsigned int delay, rts::MonitorCallback& callback)
+void rts::monitorDirectories(const std::vector<Zstring>& dirnamePhrases, unsigned int delay, rts::MonitorCallback& callback)
{
- if (dirNamesNonFmt.empty())
+ if (dirnamePhrases.empty())
{
assert(false);
return;
@@ -222,7 +218,7 @@ void rts::monitorDirectories(const std::vector<Zstring>& dirNamesNonFmt, unsigne
auto execMonitoring = [&] //throw FileError
{
callback.setPhase(MonitorCallback::MONITOR_PHASE_WAITING);
- waitForMissingDirs(dirNamesNonFmt, [&](const Zstring& dirname) { callback.requestUiRefresh(); }); //throw FileError
+ waitForMissingDirs(dirnamePhrases, [&](const Zstring& dirname) { callback.requestUiRefresh(); }); //throw FileError
callback.setPhase(MonitorCallback::MONITOR_PHASE_ACTIVE);
//schedule initial execution (*after* all directories have arrived, which could take some time which we don't want to include)
@@ -236,7 +232,7 @@ void rts::monitorDirectories(const std::vector<Zstring>& dirNamesNonFmt, unsigne
while (true) //loop over detected changes
{
//wait for changes (and for all directories to become available)
- WaitResult res = waitForChanges(dirNamesNonFmt, [&](bool readyForSync) //throw FileError, ExecCommandNowException
+ WaitResult res = waitForChanges(dirnamePhrases, [&](bool readyForSync) //throw FileError, ExecCommandNowException
{
if (readyForSync)
if (nextExecDate <= std::time(nullptr))
@@ -247,7 +243,7 @@ void rts::monitorDirectories(const std::vector<Zstring>& dirNamesNonFmt, unsigne
{
case WaitResult::CHANGE_DIR_MISSING: //don't execute the command before all directories are available!
callback.setPhase(MonitorCallback::MONITOR_PHASE_WAITING);
- waitForMissingDirs(dirNamesNonFmt, [&](const Zstring& dirname) { callback.requestUiRefresh(); }); //throw FileError
+ waitForMissingDirs(dirnamePhrases, [&](const Zstring& dirname) { callback.requestUiRefresh(); }); //throw FileError
callback.setPhase(MonitorCallback::MONITOR_PHASE_ACTIVE);
break;
diff --git a/RealtimeSync/monitor.h b/FreeFileSync/Source/RealtimeSync/monitor.h
index 0b9dfbc0..81569239 100644
--- a/RealtimeSync/monitor.h
+++ b/FreeFileSync/Source/RealtimeSync/monitor.h
@@ -29,7 +29,7 @@ struct MonitorCallback
virtual void requestUiRefresh() = 0;
virtual void reportError(const std::wstring& msg) = 0; //automatically retries after return!
};
-void monitorDirectories(const std::vector<Zstring>& dirNamesNonFmt,
+void monitorDirectories(const std::vector<Zstring>& dirnamePhrases,
//non-formatted dirnames that yet require call to getFormattedDirectoryName(); empty directories must be checked by caller!
unsigned int delay,
MonitorCallback& callback);
diff --git a/RealtimeSync/tray_menu.cpp b/FreeFileSync/Source/RealtimeSync/tray_menu.cpp
index 6e67b5ec..6e67b5ec 100644
--- a/RealtimeSync/tray_menu.cpp
+++ b/FreeFileSync/Source/RealtimeSync/tray_menu.cpp
diff --git a/RealtimeSync/tray_menu.h b/FreeFileSync/Source/RealtimeSync/tray_menu.h
index 1f71a017..1f71a017 100644
--- a/RealtimeSync/tray_menu.h
+++ b/FreeFileSync/Source/RealtimeSync/tray_menu.h
diff --git a/RealtimeSync/xml_ffs.cpp b/FreeFileSync/Source/RealtimeSync/xml_ffs.cpp
index 149b0bbe..224337ad 100644
--- a/RealtimeSync/xml_ffs.cpp
+++ b/FreeFileSync/Source/RealtimeSync/xml_ffs.cpp
@@ -20,16 +20,15 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat
std::set<Zstring, LessFilename> uniqueFolders;
//add main folders
- uniqueFolders.insert(batchCfg.mainCfg.firstPair.leftDirectory);
- uniqueFolders.insert(batchCfg.mainCfg.firstPair.rightDirectory);
+ uniqueFolders.insert(batchCfg.mainCfg.firstPair.dirnamePhraseLeft);
+ uniqueFolders.insert(batchCfg.mainCfg.firstPair.dirnamePhraseRight);
//additional folders
- std::for_each(batchCfg.mainCfg.additionalPairs.begin(), batchCfg.mainCfg.additionalPairs.end(),
- [&](const FolderPairEnh & fp)
+ for (const FolderPairEnh& fp : batchCfg.mainCfg.additionalPairs)
{
- uniqueFolders.insert(fp.leftDirectory);
- uniqueFolders.insert(fp.rightDirectory);
- });
+ uniqueFolders.insert(fp.dirnamePhraseLeft);
+ uniqueFolders.insert(fp.dirnamePhraseRight);
+ }
uniqueFolders.erase(Zstring());
@@ -42,21 +41,20 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat
void rts::readRealOrBatchConfig(const Zstring& filename, xmlAccess::XmlRealConfig& config) //throw xmlAccess::FfsXmlError;
{
- if (xmlAccess::getXmlType(filename) != xmlAccess::XML_TYPE_BATCH)
- {
- xmlAccess::readRealConfig(filename, config);
- return;
- }
+ using namespace xmlAccess;
+
+ if (getXmlType(filename) != XML_TYPE_BATCH) //throw FfsXmlError
+ return readRealConfig(filename, config); //throw FfsXmlError
//convert batch config to RealtimeSync config
- xmlAccess::XmlBatchConfig batchCfg;
+ XmlBatchConfig batchCfg;
try
{
- xmlAccess::readConfig(filename, batchCfg); //throw xmlAccess::FfsXmlError;
+ readConfig(filename, batchCfg); //throw FfsXmlError;
}
- catch (const xmlAccess::FfsXmlError& e)
+ catch (const FfsXmlError& e)
{
- if (e.getSeverity() == xmlAccess::FfsXmlError::WARNING)
+ if (e.getSeverity() == FfsXmlError::WARNING)
config = convertBatchToReal(batchCfg, filename); //do work despite parsing errors, then re-throw
throw; //
diff --git a/RealtimeSync/xml_ffs.h b/FreeFileSync/Source/RealtimeSync/xml_ffs.h
index 90c1c6ca..90c1c6ca 100644
--- a/RealtimeSync/xml_ffs.h
+++ b/FreeFileSync/Source/RealtimeSync/xml_ffs.h
diff --git a/RealtimeSync/xml_proc.cpp b/FreeFileSync/Source/RealtimeSync/xml_proc.cpp
index db235ecb..db235ecb 100644
--- a/RealtimeSync/xml_proc.cpp
+++ b/FreeFileSync/Source/RealtimeSync/xml_proc.cpp
diff --git a/RealtimeSync/xml_proc.h b/FreeFileSync/Source/RealtimeSync/xml_proc.h
index 671a237f..671a237f 100644
--- a/RealtimeSync/xml_proc.h
+++ b/FreeFileSync/Source/RealtimeSync/xml_proc.h
diff --git a/algorithm.cpp b/FreeFileSync/Source/algorithm.cpp
index 44e3f643..04d56490 100644
--- a/algorithm.cpp
+++ b/FreeFileSync/Source/algorithm.cpp
@@ -166,10 +166,10 @@ private:
bool allItemsCategoryEqual(const HierarchyObject& hierObj)
{
return std::all_of(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(),
- [](const FilePair& fileObj) { return fileObj.getCategory() == FILE_EQUAL; })&& //files
+ [](const FilePair& fileObj) { return fileObj.getCategory() == FILE_EQUAL; })&& //files
std::all_of(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(),
- [](const SymlinkPair& linkObj) { return linkObj.getLinkCategory() == SYMLINK_EQUAL; })&& //symlinks
+ [](const SymlinkPair& linkObj) { return linkObj.getLinkCategory() == SYMLINK_EQUAL; })&& //symlinks
std::all_of(hierObj.refSubDirs(). begin(), hierObj.refSubDirs().end(),
[](const DirPair& dirObj)
@@ -1317,6 +1317,7 @@ void deleteFromGridAndHDOneSide(std::vector<FileSystemObject*>& ptrList,
for (auto it = ptrList.begin(); it != ptrList.end(); ++it) //VS 2010 bug prevents replacing this by std::for_each + lamba
{
FileSystemObject& fsObj = **it; //all pointers are required(!) to be bound
+
if (!fsObj.isEmpty<side>()) //element may be implicitly deleted, e.g. if parent folder was deleted first
tryReportingError([&]
{
diff --git a/algorithm.h b/FreeFileSync/Source/algorithm.h
index 09adb5ec..09adb5ec 100644
--- a/algorithm.h
+++ b/FreeFileSync/Source/algorithm.h
diff --git a/Application.cpp b/FreeFileSync/Source/application.cpp
index f84614f7..b474d05f 100644
--- a/Application.cpp
+++ b/FreeFileSync/Source/application.cpp
@@ -106,7 +106,7 @@ std::vector<Zstring> getCommandlineArgs(const wxApp& app)
#else
for (int i = 1; i < app.argc; ++i) //wxWidgets screws up once again making "argv implicitly convertible to a wxChar**" in 2.9.3,
- args.push_back(toZ(wxString(app.argv[i]))); //so we are forced to use this pitiful excuse for a range construction!!
+ args.push_back(toZ(wxString(app.argv[i]))); //so we are forced to use this pitiful excuse for a range construction!!
#endif
return args;
}
@@ -319,19 +319,27 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
}
}
- switch (getXmlType(filename)) //throw()
+ try
{
- case XML_TYPE_GLOBAL:
- case XML_TYPE_OTHER:
- notifyError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filename)), std::wstring());
- return;
-
- case XML_TYPE_GUI:
- configFiles.push_back(std::make_pair(filename, XML_TYPE_GUI));
- break;
- case XML_TYPE_BATCH:
- configFiles.push_back(std::make_pair(filename, XML_TYPE_BATCH));
- break;
+ switch (getXmlType(filename)) //throw FfsXmlError
+ {
+ case XML_TYPE_GUI:
+ configFiles.push_back(std::make_pair(filename, XML_TYPE_GUI));
+ break;
+ case XML_TYPE_BATCH:
+ configFiles.push_back(std::make_pair(filename, XML_TYPE_BATCH));
+ break;
+
+ case XML_TYPE_GLOBAL:
+ case XML_TYPE_OTHER:
+ notifyError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filename)), std::wstring());
+ return;
+ }
+ }
+ catch (const FfsXmlError& e)
+ {
+ notifyError(e.toString(), std::wstring());
+ return;
}
}
}
@@ -344,8 +352,8 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
auto hasNonDefaultConfig = [](const FolderPairEnh& fp)
{
- return !(fp == FolderPairEnh(fp.leftDirectory,
- fp.rightDirectory,
+ return !(fp == FolderPairEnh(fp.dirnamePhraseLeft,
+ fp.dirnamePhraseRight,
nullptr, nullptr, FilterConfig()));
};
@@ -364,8 +372,8 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
for (size_t i = 0; i < leftDirs.size(); ++i)
if (i == 0)
{
- mainCfg.firstPair.leftDirectory = leftDirs [0];
- mainCfg.firstPair.rightDirectory = rightDirs[0];
+ mainCfg.firstPair.dirnamePhraseLeft = leftDirs [0];
+ mainCfg.firstPair.dirnamePhraseRight = rightDirs[0];
}
else
mainCfg.additionalPairs.push_back(FolderPairEnh(leftDirs [i],
diff --git a/Application.h b/FreeFileSync/Source/application.h
index defc1e17..defc1e17 100644
--- a/Application.h
+++ b/FreeFileSync/Source/application.h
diff --git a/comparison.cpp b/FreeFileSync/Source/comparison.cpp
index f65d5b26..2b3a37b0 100644
--- a/comparison.cpp
+++ b/FreeFileSync/Source/comparison.cpp
@@ -37,11 +37,7 @@ std::vector<FolderPairCfg> zen::extractCompareCfg(const MainConfiguration& mainC
std::transform(allPairs.begin(), allPairs.end(), std::back_inserter(output),
[&](const FolderPairEnh& enhPair) -> FolderPairCfg
{
- const Zstring leftDirFmt = getFormattedDirectoryName(enhPair.leftDirectory); //ensure they end with FILE_NAME_SEPARATOR and replace macros
- const Zstring rightDirFmt = getFormattedDirectoryName(enhPair.rightDirectory); //
-
- return FolderPairCfg(leftDirFmt, rightDirFmt,
-
+ return FolderPairCfg(enhPair.dirnamePhraseLeft, enhPair.dirnamePhraseRight,
enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->compareVar : mainCfg.cmpConfig.compareVar,
enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->handleSymlinks : mainCfg.cmpConfig.handleSymlinks,
@@ -55,37 +51,39 @@ std::vector<FolderPairCfg> zen::extractCompareCfg(const MainConfiguration& mainC
//------------------------------------------------------------------------------------------
namespace
{
-void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, bool& warningInputFieldEmpty, ProcessCallback& callback)
+struct ResolvedFolderPair
{
- bool havePartialPair = false;
- bool haveFullPair = false;
+ ResolvedFolderPair(const Zstring& left, const Zstring& right) :
+ dirnameLeft(left),
+ dirnameRight(right) {}
- std::for_each(folderPairsForm.begin(), folderPairsForm.end(),
- [&](const FolderPairCfg& fpCfg)
- {
- if (fpCfg.leftDirectoryFmt.empty() != fpCfg.rightDirectoryFmt.empty())
- havePartialPair = true;
- else if (!fpCfg.leftDirectoryFmt.empty())
- haveFullPair = true;
- });
+ Zstring dirnameLeft; //resolved directory names
+ Zstring dirnameRight; //
+};
- if (havePartialPair == haveFullPair) //error if: all empty or exist both full and partial pairs -> support single-dir scenario
- callback.reportWarning(_("A folder input field is empty.") + L" \n\n" +
- _("The corresponding folder will be considered as empty."), warningInputFieldEmpty);
-}
-std::set<Zstring, LessFilename> determineExistentDirs(const std::set<Zstring, LessFilename>& dirnames,
- bool allowUserInteraction,
- ProcessCallback& callback)
+void determineExistentDirs(const std::vector<FolderPairCfg>& cfgList, //in
+ bool allowUserInteraction, ProcessCallback& callback,
+ std::vector<ResolvedFolderPair>& resolvedPairs, //out
+ std::set<Zstring, LessFilename>& existingDirs) //out
{
- std::set<Zstring, LessFilename> dirsEx;
-
- warn_static("retry klappt nicht fr [] + env vars!")
-
tryReportingError([&]
{
+ //support retry for environment variable and and variable driver letter resolution!
+ resolvedPairs.clear();
+ for (const FolderPairCfg& fpCfg : cfgList)
+ resolvedPairs.push_back(ResolvedFolderPair(getFormattedDirectoryName(fpCfg.dirnamePhraseLeft),
+ getFormattedDirectoryName(fpCfg.dirnamePhraseRight)));
+
+ std::set<Zstring, LessFilename> dirnames;
+ for (const ResolvedFolderPair& fp : resolvedPairs)
+ {
+ dirnames.insert(fp.dirnameLeft);
+ dirnames.insert(fp.dirnameRight);
+ }
+
std::set<Zstring, LessFilename> missing;
- dirsEx = getExistingDirsUpdating(dirnames, missing, allowUserInteraction, callback); //check *all* directories on each try!
+ existingDirs = getExistingDirsUpdating(dirnames, missing, allowUserInteraction, callback); //check *all* directories on each try!
if (!missing.empty())
{
std::wstring msg = _("Cannot find the following folders:") + L"\n";
@@ -95,13 +93,30 @@ std::set<Zstring, LessFilename> determineExistentDirs(const std::set<Zstring, Le
}
}, callback);
- return dirsEx;
+ assert(resolvedPairs.size() == cfgList.size()); //postcondition!
+}
+
+
+void checkForIncompleteInput(const std::vector<ResolvedFolderPair>& folderPairs, bool& warningInputFieldEmpty, ProcessCallback& callback)
+{
+ bool havePartialPair = false;
+ bool haveFullPair = false;
+
+ for (const ResolvedFolderPair& fp : folderPairs)
+ if (fp.dirnameLeft.empty() != fp.dirnameRight.empty())
+ havePartialPair = true;
+ else if (!fp.dirnameLeft.empty())
+ haveFullPair = true;
+
+ if (havePartialPair == haveFullPair) //error if: all empty or exist both full and partial pairs -> support single-dir scenario
+ callback.reportWarning(_("A folder input field is empty.") + L" \n\n" +
+ _("The corresponding folder will be considered as empty."), warningInputFieldEmpty);
}
//check whether one side is subdirectory of other side (folder pair wise!)
//similar check if one directory is read/written by multiple pairs not before beginning of synchronization
-void checkFolderDependency(const std::vector<FolderPairCfg>& folderPairsFmt, bool& warningDependentFolders, ProcessCallback& callback) //returns warning message, empty if all ok
+void checkFolderDependency(const std::vector<ResolvedFolderPair>& folderPairs, bool& warningDependentFolders, ProcessCallback& callback) //returns warning message, empty if all ok
{
std::vector<std::pair<Zstring, Zstring>> dependentDirs;
@@ -111,11 +126,11 @@ void checkFolderDependency(const std::vector<FolderPairCfg>& folderPairsFmt, boo
Zstring(rhs.c_str(), std::min(lhs.length(), rhs.length())));
};
- for (const FolderPairCfg& fpCfg : folderPairsFmt)
- if (!fpCfg.leftDirectoryFmt.empty() && !fpCfg.rightDirectoryFmt.empty()) //empty folders names may be accepted by user
+ for (const ResolvedFolderPair& fp : folderPairs)
+ if (!fp.dirnameLeft.empty() && !fp.dirnameRight.empty()) //empty folders names may be accepted by user
{
- if (dependentDir(fpCfg.leftDirectoryFmt, fpCfg.rightDirectoryFmt)) //test wheter leftDirectory begins with rightDirectory or the other way round
- dependentDirs.push_back(std::make_pair(fpCfg.leftDirectoryFmt, fpCfg.rightDirectoryFmt));
+ if (dependentDir(fp.dirnameLeft, fp.dirnameRight)) //test wheter leftDirectory begins with rightDirectory or the other way round
+ dependentDirs.push_back(std::make_pair(fp.dirnameLeft, fp.dirnameRight));
}
if (!dependentDirs.empty())
@@ -180,14 +195,15 @@ public:
ComparisonBuffer(const std::set<DirectoryKey>& keysToRead, size_t fileTimeTol, ProcessCallback& callback);
//create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended!
- std::shared_ptr<BaseDirPair> compareByTimeSize(const FolderPairCfg& fpConfig) const;
- std::list<std::shared_ptr<BaseDirPair>> compareByContent(const std::vector<FolderPairCfg>& workLoad) const;
+ std::shared_ptr<BaseDirPair> compareByTimeSize(const ResolvedFolderPair& fp, const FolderPairCfg& fpConfig) const;
+ std::list<std::shared_ptr<BaseDirPair>> compareByContent(const std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>>& workLoad) const;
private:
- ComparisonBuffer(const ComparisonBuffer&);
- ComparisonBuffer& operator=(const ComparisonBuffer&);
+ ComparisonBuffer(const ComparisonBuffer&); //=delete
+ ComparisonBuffer& operator=(const ComparisonBuffer&); //=delete
- std::shared_ptr<BaseDirPair> performComparison(const FolderPairCfg& fpCfg,
+ std::shared_ptr<BaseDirPair> performComparison(const ResolvedFolderPair& fp,
+ const FolderPairCfg& fpCfg,
std::vector<FilePair*>& undefinedFiles,
std::vector<SymlinkPair*>& undefinedLinks) const;
@@ -271,7 +287,6 @@ std::wstring getConflictSameDateDiffSize(const FilePair& fileObj)
}
-inline
std::wstring getDescrDiffMetaShortnameCase(const FileSystemObject& fsObj)
{
return _("Items differ in attributes only") + L"\n" +
@@ -280,7 +295,7 @@ std::wstring getDescrDiffMetaShortnameCase(const FileSystemObject& fsObj)
}
-template <class FileOrLinkPair> inline
+template <class FileOrLinkPair>
std::wstring getDescrDiffMetaDate(const FileOrLinkPair& fileObj)
{
return _("Items differ in attributes only") + L"\n" +
@@ -326,20 +341,19 @@ void categorizeSymlinkByTime(SymlinkPair& linkObj, size_t fileTimeTolerance)
}
-std::shared_ptr<BaseDirPair> ComparisonBuffer::compareByTimeSize(const FolderPairCfg& fpConfig) const
+std::shared_ptr<BaseDirPair> ComparisonBuffer::compareByTimeSize(const ResolvedFolderPair& fp, const FolderPairCfg& fpConfig) const
{
//do basis scan and retrieve files existing on both sides as "compareCandidates"
std::vector<FilePair*> uncategorizedFiles;
std::vector<SymlinkPair*> uncategorizedLinks;
- std::shared_ptr<BaseDirPair> output = performComparison(fpConfig, uncategorizedFiles, uncategorizedLinks);
+ std::shared_ptr<BaseDirPair> output = performComparison(fp, fpConfig, uncategorizedFiles, uncategorizedLinks);
//finish symlink categorization
- std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(),
- [&](SymlinkPair* linkObj) { categorizeSymlinkByTime(*linkObj, fileTimeTolerance); });
+ for (SymlinkPair* linkObj : uncategorizedLinks)
+ categorizeSymlinkByTime(*linkObj, fileTimeTolerance);
//categorize files that exist on both sides
- std::for_each(uncategorizedFiles.begin(), uncategorizedFiles.end(),
- [&](FilePair* fileObj)
+ for (FilePair* fileObj : uncategorizedFiles)
{
switch (CmpFileTime::getResult(fileObj->getLastWriteTime<LEFT_SIDE>(),
fileObj->getLastWriteTime<RIGHT_SIDE>(), fileTimeTolerance))
@@ -376,7 +390,7 @@ std::shared_ptr<BaseDirPair> ComparisonBuffer::compareByTimeSize(const FolderPai
fileObj->setCategoryConflict(getConflictInvalidDate(fileObj->getFullName<RIGHT_SIDE>(), fileObj->getLastWriteTime<RIGHT_SIDE>()));
break;
}
- });
+ }
return output;
}
@@ -426,7 +440,7 @@ void categorizeSymlinkByContent(SymlinkPair& linkObj, size_t fileTimeTolerance,
}
-std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const std::vector<FolderPairCfg>& workLoad) const
+std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>>& workLoad) const
{
std::list<std::shared_ptr<BaseDirPair>> output;
if (workLoad.empty())
@@ -435,17 +449,17 @@ std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const
//PERF_START;
std::vector<FilePair*> undefinedFiles;
- //process one folder pair after each other
- for (auto it = workLoad.begin(); it != workLoad.end(); ++it)
+ //process folder pairs one after another
+ for (const auto& w : workLoad)
{
std::vector<SymlinkPair*> uncategorizedLinks;
//do basis scan and retrieve candidates for binary comparison (files existing on both sides)
- output.push_back(performComparison(*it, undefinedFiles, uncategorizedLinks));
+ output.push_back(performComparison(w.first, w.second, undefinedFiles, uncategorizedLinks));
//finish symlink categorization
- std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(),
- [&](SymlinkPair* linkObj) { categorizeSymlinkByContent(*linkObj, fileTimeTolerance, callback_); });
+ for (SymlinkPair* linkObj : uncategorizedLinks)
+ categorizeSymlinkByContent(*linkObj, fileTimeTolerance, callback_);
}
//finish categorization...
@@ -454,20 +468,18 @@ std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const
//content comparison of file content happens AFTER finding corresponding files
//in order to separate into two processes (scanning and comparing)
- std::for_each(undefinedFiles.begin(), undefinedFiles.end(),
- [&](FilePair* fileObj)
- {
+ for (FilePair* fileObj : undefinedFiles)
//pre-check: files have different content if they have a different filesize (must not be FILE_EQUAL: see InSyncFile)
if (fileObj->getFileSize<LEFT_SIDE>() != fileObj->getFileSize<RIGHT_SIDE>())
fileObj->setCategory<FILE_DIFFERENT>();
else
filesToCompareBytewise.push_back(fileObj);
- });
const size_t objectsTotal = filesToCompareBytewise.size();
- const UInt64 bytesTotal = //left and right filesizes are equal
- std::accumulate(filesToCompareBytewise.begin(), filesToCompareBytewise.end(), static_cast<UInt64>(0),
- [](UInt64 sum, FilePair* fsObj) { return sum + fsObj->getFileSize<LEFT_SIDE>(); });
+
+ UInt64 bytesTotal; //left and right filesizes are equal
+ for (FilePair* fileObj : filesToCompareBytewise)
+ bytesTotal += fileObj->getFileSize<LEFT_SIDE>();
callback_.initNewPhase(static_cast<int>(objectsTotal),
to<Int64>(bytesTotal),
@@ -476,8 +488,7 @@ std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const
const std::wstring txtComparingContentOfFiles = _("Comparing content of files %x");
//compare files (that have same size) bytewise...
- std::for_each(filesToCompareBytewise.begin(), filesToCompareBytewise.end(),
- [&](FilePair* fileObj)
+ for (FilePair* fileObj : filesToCompareBytewise)
{
callback_.reportStatus(replaceCpy(txtComparingContentOfFiles, L"%x", fmtFileName(fileObj->getObjRelativeName()), false));
@@ -507,7 +518,8 @@ std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const
//3. harmonize with "bool stillInSync()" in algorithm.cpp, FilePair::syncTo() in file_hierarchy.cpp
if (fileObj->getShortName<LEFT_SIDE>() != fileObj->getShortName<RIGHT_SIDE>())
fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(*fileObj));
- else if (CmpFileTime::getResult(fileObj->getLastWriteTime<LEFT_SIDE>(), fileObj->getLastWriteTime<RIGHT_SIDE>(), fileTimeTolerance) != CmpFileTime::TIME_EQUAL)
+ else if (CmpFileTime::getResult(fileObj->getLastWriteTime<LEFT_SIDE>(),
+ fileObj->getLastWriteTime<RIGHT_SIDE>(), fileTimeTolerance) != CmpFileTime::TIME_EQUAL)
fileObj->setCategoryDiffMetadata(getDescrDiffMetaDate(*fileObj));
else
fileObj->setCategory<FILE_EQUAL>();
@@ -515,7 +527,7 @@ std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const
else
fileObj->setCategory<FILE_DIFFERENT>();
}
- });
+ }
return output;
}
@@ -680,7 +692,8 @@ void removeFilteredDirs(HierarchyObject& hierObj, const HardFilter& filterProc)
//create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended!
-std::shared_ptr<BaseDirPair> ComparisonBuffer::performComparison(const FolderPairCfg& fpCfg,
+std::shared_ptr<BaseDirPair> ComparisonBuffer::performComparison(const ResolvedFolderPair& fp,
+ const FolderPairCfg& fpCfg,
std::vector<FilePair*>& undefinedFiles,
std::vector<SymlinkPair*>& undefinedLinks) const
{
@@ -693,19 +706,21 @@ std::shared_ptr<BaseDirPair> ComparisonBuffer::performComparison(const FolderPai
return it != directoryBuffer.end() ? &it->second : nullptr;
};
- const DirectoryValue* bufValueLeft = getDirValue(fpCfg.leftDirectoryFmt);
- const DirectoryValue* bufValueRight = getDirValue(fpCfg.rightDirectoryFmt);
+ const DirectoryValue* bufValueLeft = getDirValue(fp.dirnameLeft);
+ const DirectoryValue* bufValueRight = getDirValue(fp.dirnameRight);
Zstring filterFailedRead;
auto filterAddFailedDirReads = [&filterFailedRead](const std::set<Zstring>& failedDirReads) //exclude directory child items only!
{
//note: relDirPf is empty for base dir, otherwise postfixed! e.g. "subdir\"
//an empty relDirPf is a pathological case at this point, since determineExistentDirs() already filtered missing base directories!
- std::for_each(failedDirReads .begin(), failedDirReads .end(), [&](const Zstring& relDirPf) { filterFailedRead += relDirPf + Zstr("?*\n"); });
+ for (const Zstring& relDirPf : failedDirReads)
+ filterFailedRead += relDirPf + Zstr("?*\n");
};
auto filterAddFailedItemReads = [&filterFailedRead](const std::set<Zstring>& failedItemReads) //exclude item AND (potential) child items!
{
- std::for_each(failedItemReads.begin(), failedItemReads.end(), [&](const Zstring& relItem ) { filterFailedRead += relItem + Zstr("\n"); });
+ for (const Zstring& relItem : failedItemReads)
+ filterFailedRead += relItem + Zstr("\n");
};
if (bufValueLeft ) filterAddFailedDirReads(bufValueLeft ->failedDirReads);
@@ -714,9 +729,9 @@ std::shared_ptr<BaseDirPair> ComparisonBuffer::performComparison(const FolderPai
if (bufValueLeft ) filterAddFailedItemReads(bufValueLeft ->failedItemReads);
if (bufValueRight) filterAddFailedItemReads(bufValueRight->failedItemReads);
- std::shared_ptr<BaseDirPair> output = std::make_shared<BaseDirPair>(fpCfg.leftDirectoryFmt,
+ std::shared_ptr<BaseDirPair> output = std::make_shared<BaseDirPair>(fp.dirnameLeft,
bufValueLeft != nullptr, //dir existence must be checked only once: available iff buffer entry exists!
- fpCfg.rightDirectoryFmt,
+ fp.dirnameRight,
bufValueRight != nullptr,
fpCfg.filter.nameFilter,
fpCfg.compareVar,
@@ -762,9 +777,8 @@ void zen::compare(size_t fileTimeTolerance,
{
backgroundPrio = make_unique<ScheduleForBackgroundProcessing>(); //throw FileError
}
- catch (const FileError& e)
+ catch (const FileError& e) //not an error in this context
{
- //not an error in this context
callback.reportInfo(e.toString()); //may throw!
}
@@ -774,59 +788,59 @@ void zen::compare(size_t fileTimeTolerance,
{
noStandby = make_unique<PreventStandby>(); //throw FileError
}
- catch (const FileError& e)
+ catch (const FileError& e) //not an error in this context
{
- //not an error in this context
callback.reportInfo(e.toString()); //may throw!
}
//PERF_START;
- callback.reportInfo(_("Starting comparison")); //we want some indicator at the very beginning of the log to make sense of "total time"
+ callback.reportInfo(_("Starting comparison")); //indicator at the very beginning of the log to make sense of "total time"
//init process: keep at beginning so that all gui elements are initialized properly
callback.initNewPhase(-1, 0, ProcessCallback::PHASE_SCANNING); //it's not known how many files will be scanned => -1 objects
//-------------------some basic checks:------------------------------------------
- checkForIncompleteInput(cfgList, warnings.warningInputFieldEmpty, callback);
- checkFolderDependency (cfgList, warnings.warningDependentFolders, callback);
-
- std::set<Zstring, LessFilename> dirnamesExisting;
- //list of directories that are *expected* to be existent (and need to be scanned)!
+ std::vector<ResolvedFolderPair> resolvedPairs;
+ std::set<Zstring, LessFilename> existingDirs;
+ determineExistentDirs(cfgList, //in
+ allowUserInteraction, callback,
+ resolvedPairs, //out
+ existingDirs); //out
//directory existence only checked *once* to avoid race conditions!
- {
- std::set<Zstring, LessFilename> dirnames;
- std::for_each(cfgList.begin(), cfgList.end(),
- [&](const FolderPairCfg& fpCfg)
- {
- dirnames.insert(fpCfg.leftDirectoryFmt);
- dirnames.insert(fpCfg.rightDirectoryFmt);
- });
- dirnamesExisting = determineExistentDirs(dirnames, allowUserInteraction, callback);
- }
+ if (resolvedPairs.size() != cfgList.size())
+ throw std::logic_error("Programming Error: Contract violation! " + std::string(__FILE__) + ":" + numberTo<std::string>(__LINE__));
- auto dirAvailable = [&](const Zstring& dirnameFmt) { return dirnamesExisting.find(dirnameFmt) != dirnamesExisting.end(); };
+ checkForIncompleteInput(resolvedPairs, warnings.warningInputFieldEmpty, callback);
+ checkFolderDependency (resolvedPairs, warnings.warningDependentFolders, callback);
+
+ //list of directories that are *expected* to be existent (and need to be scanned)!
//-------------------end of basic checks------------------------------------------
+ auto dirAvailable = [&](const Zstring& dirnameFmt) { return existingDirs.find(dirnameFmt) != existingDirs.end(); };
+
+ std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>> totalWorkLoad;
+ for (size_t i = 0; i < cfgList.size(); ++i)
+ totalWorkLoad.push_back(std::make_pair(resolvedPairs[i], cfgList[i]));
+
+ //lock (existing) directories before comparison
+ if (createDirLocks)
+ dirLocks = make_unique<LockHolder>(existingDirs, warnings.warningDirectoryLockFailed, callback);
+
try
{
- //lock (existing) directories before comparison
- if (createDirLocks)
- dirLocks = make_unique<LockHolder>(dirnamesExisting, warnings.warningDirectoryLockFailed, callback);
-
//------------------- fill directory buffer ---------------------------------------------------
std::set<DirectoryKey> dirsToRead;
- std::for_each(cfgList.begin(), cfgList.end(),
- [&](const FolderPairCfg& fpCfg)
+ for (const auto& w : totalWorkLoad)
{
- if (dirAvailable(fpCfg.leftDirectoryFmt)) //only request *currently existing* directories: at this point user is aware that non-ex + empty string are seen as empty folder!
- dirsToRead.insert(DirectoryKey(fpCfg.leftDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks));
- if (dirAvailable(fpCfg.rightDirectoryFmt))
- dirsToRead.insert(DirectoryKey(fpCfg.rightDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks));
- });
+ if (dirAvailable(w.first.dirnameLeft)) //only request *currently existing* directories: at this point user is aware that non-ex + empty string are seen as empty folder!
+ dirsToRead.insert(DirectoryKey(w.first.dirnameLeft, w.second.filter.nameFilter, w.second.handleSymlinks));
+ if (dirAvailable(w.first.dirnameRight))
+ dirsToRead.insert(DirectoryKey(w.first.dirnameRight, w.second.filter.nameFilter, w.second.handleSymlinks));
+ }
FolderComparison outputTmp; //write to output as a transaction!
@@ -835,25 +849,25 @@ void zen::compare(size_t fileTimeTolerance,
//------------ traverse/read folders -----------------------------------------------------
ComparisonBuffer cmpBuff(dirsToRead, fileTimeTolerance, callback);
- //process binary comparison in one block
- std::vector<FolderPairCfg> workLoadByContent;
- for (const FolderPairCfg& fpCfg : cfgList)
- switch (fpCfg.compareVar)
+ //process binary comparison as one junk
+ std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>> workLoadByContent;
+ for (const auto& w : totalWorkLoad)
+ switch (w.second.compareVar)
{
case CMP_BY_TIME_SIZE:
break;
case CMP_BY_CONTENT:
- workLoadByContent.push_back(fpCfg);
+ workLoadByContent.push_back(w);
break;
}
std::list<std::shared_ptr<BaseDirPair>> outputByContent = cmpBuff.compareByContent(workLoadByContent);
- //write output in order
- for (const FolderPairCfg& fpCfg : cfgList)
- switch (fpCfg.compareVar)
+ //write output in expected order
+ for (const auto& w : totalWorkLoad)
+ switch (w.second.compareVar)
{
case CMP_BY_TIME_SIZE:
- outputTmp.push_back(cmpBuff.compareByTimeSize(fpCfg));
+ outputTmp.push_back(cmpBuff.compareByTimeSize(w.first, w.second));
break;
case CMP_BY_CONTENT:
assert(!outputByContent.empty());
@@ -880,16 +894,14 @@ void zen::compare(size_t fileTimeTolerance,
[&](const std::wstring& warning) { callback.reportWarning(warning, warnings.warningDatabaseError); });
}
- //only if everything was processed correctly output is written to!
+ //output is written only if everything was processed correctly
//note: output mustn't change during this process to be in sync with GUI grid view!!!
outputTmp.swap(output);
}
catch (const std::bad_alloc& e)
{
callback.reportFatalError(_("Out of memory.") + L" " + utfCvrtTo<std::wstring>(e.what()));
- }
- catch (const std::exception& e)
- {
- callback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
+ //we need to maintain the "output.size() == cfgList.size()" contract in ALL cases! => abort
+ callback.abortProcessNow(); //throw X
}
}
diff --git a/comparison.h b/FreeFileSync/Source/comparison.h
index 0b92bade..c3c31d1d 100644
--- a/comparison.h
+++ b/FreeFileSync/Source/comparison.h
@@ -18,21 +18,21 @@ namespace zen
{
struct FolderPairCfg
{
- FolderPairCfg(const Zstring& leftDir, //must be formatted folder pairs!
- const Zstring& rightDir,
+ FolderPairCfg(const Zstring& dirPhraseLeft,
+ const Zstring& dirPhraseRight,
CompareVariant cmpVar,
SymLinkHandling handleSymlinksIn,
const NormalizedFilter& filterIn,
const DirectionConfig& directCfg) :
- leftDirectoryFmt(leftDir),
- rightDirectoryFmt(rightDir),
+ dirnamePhraseLeft(dirPhraseLeft),
+ dirnamePhraseRight(dirPhraseRight),
compareVar(cmpVar),
handleSymlinks(handleSymlinksIn),
filter(filterIn),
directionCfg(directCfg) {}
- Zstring leftDirectoryFmt; //resolved directory names!
- Zstring rightDirectoryFmt; //
+ Zstring dirnamePhraseLeft; //unresolved directory names as entered by user!
+ Zstring dirnamePhraseRight; //
CompareVariant compareVar;
SymLinkHandling handleSymlinks;
diff --git a/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj b/FreeFileSync/Source/dll/IFileDialog_Vista/IFileDialog_Vista.vcxproj
index 7f84b4fb..009d38dd 100644
--- a/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj
+++ b/FreeFileSync/Source/dll/IFileDialog_Vista/IFileDialog_Vista.vcxproj
@@ -19,14 +19,14 @@
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
- <ClCompile Include="..\..\zen\debug_memory_leaks.cpp" />
+ <ClCompile Include="..\..\..\..\zen\debug_memory_leaks.cpp" />
<ClCompile Include="ifile_dialog.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="ifile_dialog.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid>
+ <ProjectGuid>{E93269BB-36D4-4CE8-A7BE-F7A335D1D8E8}</ProjectGuid>
<RootNamespace>ShadowDll</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
@@ -54,8 +54,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -68,177 +66,100 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
- <PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">IFileDialog_Vista_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">IFileDialog_Vista_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">IFileDialog_Vista_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">IFileDialog_Vista_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectName)_$(Platform)</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
- <SmallerTypeCheck>false</SmallerTypeCheck>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
- <SmallerTypeCheck>false</SmallerTypeCheck>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>
- </AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/ui/IFileDialog_Vista/ifile_dialog.cpp b/FreeFileSync/Source/dll/IFileDialog_Vista/ifile_dialog.cpp
index f56df9e7..f56df9e7 100644
--- a/ui/IFileDialog_Vista/ifile_dialog.cpp
+++ b/FreeFileSync/Source/dll/IFileDialog_Vista/ifile_dialog.cpp
diff --git a/ui/IFileDialog_Vista/ifile_dialog.h b/FreeFileSync/Source/dll/IFileDialog_Vista/ifile_dialog.h
index 5b4dc532..5b4dc532 100644
--- a/ui/IFileDialog_Vista/ifile_dialog.h
+++ b/FreeFileSync/Source/dll/IFileDialog_Vista/ifile_dialog.h
diff --git a/lib/ShadowCopy/Shadow_Windows7.vcxproj b/FreeFileSync/Source/dll/ShadowCopy/Shadow_Windows7.vcxproj
index 86df3453..0ff01a5d 100644
--- a/lib/ShadowCopy/Shadow_Windows7.vcxproj
+++ b/FreeFileSync/Source/dll/ShadowCopy/Shadow_Windows7.vcxproj
@@ -19,7 +19,7 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectName>Windows7</ProjectName>
+ <ProjectName>Shadow_Windows7</ProjectName>
<ProjectGuid>{7E217D76-90A5-4B03-A6F8-E7C3ADD22901}</ProjectGuid>
<RootNamespace>ShadowDll</RootNamespace>
<Keyword>Win32Proj</Keyword>
@@ -49,8 +49,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -63,178 +61,109 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
- <PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Shadow_$(ProjectName)_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Shadow_$(ProjectName)_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Shadow_$(ProjectName)_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Shadow_$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectName)_$(Platform)</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_WINDOWS7;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_WINDOWS7;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_WINDOWS7;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;SHADOWDLL_EXPORTS;USE_SHADOW_WINDOWS7;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClCompile Include="..\..\zen\debug_memory_leaks.cpp" />
+ <ClCompile Include="..\..\..\..\zen\debug_memory_leaks.cpp" />
<ClCompile Include="shadow.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="shadow.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/lib/ShadowCopy/shadow.cpp b/FreeFileSync/Source/dll/ShadowCopy/shadow.cpp
index adc7c5c2..adc7c5c2 100644
--- a/lib/ShadowCopy/shadow.cpp
+++ b/FreeFileSync/Source/dll/ShadowCopy/shadow.cpp
diff --git a/lib/ShadowCopy/shadow.h b/FreeFileSync/Source/dll/ShadowCopy/shadow.h
index e68b2655..e68b2655 100644
--- a/lib/ShadowCopy/shadow.h
+++ b/FreeFileSync/Source/dll/ShadowCopy/shadow.h
diff --git a/ui/Taskbar_Seven/Taskbar_Seven.vcxproj b/FreeFileSync/Source/dll/Taskbar_Seven/Taskbar_Seven.vcxproj
index 2617569a..99c7fd65 100644
--- a/ui/Taskbar_Seven/Taskbar_Seven.vcxproj
+++ b/FreeFileSync/Source/dll/Taskbar_Seven/Taskbar_Seven.vcxproj
@@ -19,9 +19,10 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid>
+ <ProjectGuid>{78782859-7081-4C0E-BD6C-43DFDE634406}</ProjectGuid>
<RootNamespace>ShadowDll</RootNamespace>
<Keyword>Win32Proj</Keyword>
+ <ProjectName>Taskbar7</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@@ -47,8 +48,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -64,173 +63,105 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Taskbar7_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Taskbar7_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Taskbar7_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Taskbar7_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectName)_$(Platform)</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;TASKBAR_SEVEN_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClCompile Include="..\..\zen\debug_memory_leaks.cpp" />
+ <ClCompile Include="..\..\..\..\zen\debug_memory_leaks.cpp" />
<ClCompile Include="taskbar.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="taskbar.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/ui/Taskbar_Seven/taskbar.cpp b/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp
index 72be7016..72be7016 100644
--- a/ui/Taskbar_Seven/taskbar.cpp
+++ b/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp
diff --git a/ui/Taskbar_Seven/taskbar.h b/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.h
index 4a158d1f..4a158d1f 100644
--- a/ui/Taskbar_Seven/taskbar.h
+++ b/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.h
diff --git a/lib/Thumbnail/Thumbnail.vcxproj b/FreeFileSync/Source/dll/Thumbnail/Thumbnail.vcxproj
index a98aadab..b54cf4f3 100644
--- a/lib/Thumbnail/Thumbnail.vcxproj
+++ b/FreeFileSync/Source/dll/Thumbnail/Thumbnail.vcxproj
@@ -19,7 +19,7 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid>
+ <ProjectGuid>{47AB4CD0-08E7-4F4C-8517-5B139957DB71}</ProjectGuid>
<RootNamespace>ShadowDll</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
@@ -47,8 +47,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -61,176 +59,107 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
- <PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Thumbnail_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Thumbnail_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Thumbnail_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Thumbnail_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectName)_$(Platform)</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClCompile Include="..\..\zen\debug_memory_leaks.cpp" />
+ <ClCompile Include="..\..\..\..\zen\debug_memory_leaks.cpp" />
<ClCompile Include="thumbnail.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="thumbnail.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/lib/Thumbnail/thumbnail.cpp b/FreeFileSync/Source/dll/Thumbnail/thumbnail.cpp
index 53c30bc3..53c30bc3 100644
--- a/lib/Thumbnail/thumbnail.cpp
+++ b/FreeFileSync/Source/dll/Thumbnail/thumbnail.cpp
diff --git a/lib/Thumbnail/thumbnail.h b/FreeFileSync/Source/dll/Thumbnail/thumbnail.h
index 307fc7cc..307fc7cc 100644
--- a/lib/Thumbnail/thumbnail.h
+++ b/FreeFileSync/Source/dll/Thumbnail/thumbnail.h
diff --git a/file_hierarchy.cpp b/FreeFileSync/Source/file_hierarchy.cpp
index 780f05de..780f05de 100644
--- a/file_hierarchy.cpp
+++ b/FreeFileSync/Source/file_hierarchy.cpp
diff --git a/file_hierarchy.h b/FreeFileSync/Source/file_hierarchy.h
index ce3a96b0..e8f35246 100644
--- a/file_hierarchy.h
+++ b/FreeFileSync/Source/file_hierarchy.h
@@ -341,8 +341,8 @@ public:
static const T* retrieve(ObjectIdConst id) //returns nullptr if object is not valid anymore
{
- auto iter = activeObjects().find(id);
- return static_cast<const T*>(iter == activeObjects().end() ? nullptr : *iter);
+ auto it = activeObjects().find(id);
+ return static_cast<const T*>(it == activeObjects().end() ? nullptr : *it);
}
static T* retrieve(ObjectId id) { return const_cast<T*>(retrieve(static_cast<ObjectIdConst>(id))); }
@@ -351,8 +351,8 @@ protected:
~ObjectMgr() { activeObjects().erase (this); }
private:
- ObjectMgr(const ObjectMgr& rhs); //
- ObjectMgr& operator=(const ObjectMgr& rhs); //it's not well-defined what coping an objects means regarding object-identity in this context
+ ObjectMgr(const ObjectMgr& rhs); //= delete
+ ObjectMgr& operator=(const ObjectMgr& rhs); //it's not well-defined what copying an objects means regarding object-identity in this context
static zen::hash_set<const ObjectMgr*>& activeObjects() { static zen::hash_set<const ObjectMgr*> inst; return inst; } //external linkage (even in header file!)
};
diff --git a/lib/Batch.ico b/FreeFileSync/Source/lib/Batch.ico
index faa2db64..faa2db64 100644
--- a/lib/Batch.ico
+++ b/FreeFileSync/Source/lib/Batch.ico
Binary files differ
diff --git a/lib/FreeFileSync.ico b/FreeFileSync/Source/lib/FreeFileSync.ico
index 88f656ee..88f656ee 100644
--- a/lib/FreeFileSync.ico
+++ b/FreeFileSync/Source/lib/FreeFileSync.ico
Binary files differ
diff --git a/lib/SyncDB.ico b/FreeFileSync/Source/lib/SyncDB.ico
index 9740a338..9740a338 100644
--- a/lib/SyncDB.ico
+++ b/FreeFileSync/Source/lib/SyncDB.ico
Binary files differ
diff --git a/lib/binary.cpp b/FreeFileSync/Source/lib/binary.cpp
index 0e41f7a6..0e41f7a6 100644
--- a/lib/binary.cpp
+++ b/FreeFileSync/Source/lib/binary.cpp
diff --git a/lib/binary.h b/FreeFileSync/Source/lib/binary.h
index 8a4abe6b..8a4abe6b 100644
--- a/lib/binary.h
+++ b/FreeFileSync/Source/lib/binary.h
diff --git a/lib/cmp_filetime.h b/FreeFileSync/Source/lib/cmp_filetime.h
index 4e75675b..33d214ab 100644
--- a/lib/cmp_filetime.h
+++ b/FreeFileSync/Source/lib/cmp_filetime.h
@@ -1,7 +1,8 @@
#ifndef CMP_FILETIME_H_INCLUDED
#define CMP_FILETIME_H_INCLUDED
-#include <wx/stopwatch.h>
+//#include <wx/stopwatch.h>
+#include <wx/time.h>
#include <zen/int64.h>
namespace zen
diff --git a/lib/db_file.cpp b/FreeFileSync/Source/lib/db_file.cpp
index 1c2a34f3..1c2a34f3 100644
--- a/lib/db_file.cpp
+++ b/FreeFileSync/Source/lib/db_file.cpp
diff --git a/lib/db_file.h b/FreeFileSync/Source/lib/db_file.h
index c432704d..c432704d 100644
--- a/lib/db_file.h
+++ b/FreeFileSync/Source/lib/db_file.h
diff --git a/lib/dir_exist_async.h b/FreeFileSync/Source/lib/dir_exist_async.h
index 19e5f745..a6eff1c0 100644
--- a/lib/dir_exist_async.h
+++ b/FreeFileSync/Source/lib/dir_exist_async.h
@@ -10,7 +10,7 @@
#include <zen/thread.h>
#include <zen/file_handling.h>
#include <zen/file_error.h>
-#include "process_callback.h"
+#include "../process_callback.h"
#include "resolve_path.h"
namespace zen
@@ -32,7 +32,7 @@ std::set<Zstring, LessFilename> getExistingDirsUpdating(const std::set<Zstring,
std::list<std::pair<Zstring, boost::unique_future<bool>>> futureInfo;
for (const Zstring& dirname : dirnames)
- if (!dirname.empty())
+ if (!dirname.empty()) //skip empty dirs
futureInfo.push_back(std::make_pair(dirname, async2<bool>([=]() -> bool
{
#ifdef ZEN_WIN
diff --git a/lib/dir_lock.cpp b/FreeFileSync/Source/lib/dir_lock.cpp
index fb016e1e..47249d3e 100644
--- a/lib/dir_lock.cpp
+++ b/FreeFileSync/Source/lib/dir_lock.cpp
@@ -259,9 +259,9 @@ struct LockInformation //throw FileError
::GetComputerNameEx(ComputerNameDnsFullyQualified, nullptr, &bufferSize); //get required buffer size
std::vector<wchar_t> buffer(bufferSize);
- if (!::GetComputerNameEx(ComputerNameDnsFullyQualified, //__in COMPUTER_NAME_FORMAT NameType,
- &buffer[0], //__out LPTSTR lpBuffer,
- &bufferSize)) //__inout LPDWORD lpnSize
+ if (!::GetComputerNameEx(ComputerNameDnsFullyQualified, //__in COMPUTER_NAME_FORMAT NameType,
+ bufferSize > 0 ? &buffer[0] : nullptr, //__out LPTSTR lpBuffer,
+ &bufferSize)) //__inout LPDWORD lpnSize
throw FileError(_("Cannot get process information."), formatSystemError(L"GetComputerNameEx", getLastError()));
computerName = "Windows." + utfCvrtTo<std::string>(&buffer[0]);
@@ -289,17 +289,17 @@ struct LockInformation //throw FileError
computerName += &buffer[0];
const uid_t userIdNo = ::getuid(); //never fails
- userId.assign(reinterpret_cast<const char*>(&userIdNo), sizeof(userIdNo));
+ userId = numberTo<std::string>(userIdNo);
- //the id alone is not very distinctive, e.g. often 1000 on Ubuntu => add name
+ //the id alone is not very distinctive, e.g. often 1000 on Ubuntu => add name
buffer.resize(std::max<long>(buffer.size(), ::sysconf(_SC_GETPW_R_SIZE_MAX))); //::sysconf may return long(-1)
struct passwd buffer2 = {};
struct passwd* pwsEntry = nullptr;
if (::getpwuid_r(userIdNo, &buffer2, &buffer[0], buffer.size(), &pwsEntry) != 0) //getlogin() is deprecated and not working on Ubuntu at all!!!
throw FileError(_("Cannot get process information."), formatSystemError(L"getpwuid_r", getLastError()));
if (!pwsEntry)
- throw FileError(_("Cannot get process information."), L"no login found"); //should not happen?
- userId += pwsEntry->pw_name;
+ throw FileError(_("Cannot get process information."), L"no login found"); //should not happen?
+ userId += '(' + std::string(pwsEntry->pw_name) + ')'; //follow Linux naming convention "1000(zenju)"
#endif
Opt<SessionId> sessionIdTmp = getSessionId(processId); //throw FileError
@@ -407,7 +407,7 @@ const std::int64_t TICKS_PER_SEC = ticksPerSec(); //= 0 on error
void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //throw FileError
{
- const std::wstring infoMsg = replaceCpy(_("Waiting while directory is locked (%x)..."), L"%x", fmtFileName(lockfilename));
+ std::wstring infoMsg = _("Waiting while directory is locked:") + L' ' + fmtFileName(lockfilename);
if (callback)
callback->reportStatus(infoMsg);
@@ -420,6 +420,9 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr
try
{
const LockInformation& lockInfo = retrieveLockInfo(lockfilename); //throw FileError
+ //enhance status message and show which user is holding the lock:
+ infoMsg += L" | " + _("Lock owner:") + L' ' + utfCvrtTo<std::wstring>(lockInfo.userId);
+
originalLockId = lockInfo.lockId;
switch (getProcessStatus(lockInfo)) //throw FileError
{
@@ -483,7 +486,7 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr
{
const int remainingSeconds = std::max<int>(0, DETECT_ABANDONED_INTERVAL - dist(lastLifeSign, getTicks()) / TICKS_PER_SEC);
const std::wstring remSecMsg = replaceCpy(_P("1 sec", "%x sec", remainingSeconds), L"%x", numberTo<std::wstring>(remainingSeconds));
- callback->reportStatus(infoMsg + L" " + remSecMsg);
+ callback->reportStatus(infoMsg + L" | " + _("Detecting abandoned lock...") + L' ' + remSecMsg);
}
else
callback->reportStatus(infoMsg); //emit a message in any case (might clear other one)
diff --git a/lib/dir_lock.h b/FreeFileSync/Source/lib/dir_lock.h
index ec2a431a..ec2a431a 100644
--- a/lib/dir_lock.h
+++ b/FreeFileSync/Source/lib/dir_lock.h
diff --git a/lib/error_log.h b/FreeFileSync/Source/lib/error_log.h
index 2971f746..2971f746 100644
--- a/lib/error_log.h
+++ b/FreeFileSync/Source/lib/error_log.h
diff --git a/lib/ffs_paths.cpp b/FreeFileSync/Source/lib/ffs_paths.cpp
index 5c775d3e..5c775d3e 100644
--- a/lib/ffs_paths.cpp
+++ b/FreeFileSync/Source/lib/ffs_paths.cpp
diff --git a/lib/ffs_paths.h b/FreeFileSync/Source/lib/ffs_paths.h
index 28516a3f..28516a3f 100644
--- a/lib/ffs_paths.h
+++ b/FreeFileSync/Source/lib/ffs_paths.h
diff --git a/lib/generate_logfile.h b/FreeFileSync/Source/lib/generate_logfile.h
index ff97b63a..34e1c247 100644
--- a/lib/generate_logfile.h
+++ b/FreeFileSync/Source/lib/generate_logfile.h
@@ -24,7 +24,7 @@ struct SummaryInfo
Int64 dataSynced;
int itemsTotal;
Int64 dataTotal;
- long totalTime; //unit: [sec]
+ int64_t totalTime; //unit: [sec]
};
void saveLogToFile(const SummaryInfo& summary, //throw FileError
diff --git a/lib/hard_filter.cpp b/FreeFileSync/Source/lib/hard_filter.cpp
index 687aecd8..687aecd8 100644
--- a/lib/hard_filter.cpp
+++ b/FreeFileSync/Source/lib/hard_filter.cpp
diff --git a/lib/hard_filter.h b/FreeFileSync/Source/lib/hard_filter.h
index e721fe4f..e721fe4f 100644
--- a/lib/hard_filter.h
+++ b/FreeFileSync/Source/lib/hard_filter.h
diff --git a/lib/help_provider.h b/FreeFileSync/Source/lib/help_provider.h
index 8ddc34c7..8ddc34c7 100644
--- a/lib/help_provider.h
+++ b/FreeFileSync/Source/lib/help_provider.h
diff --git a/lib/icon_buffer.cpp b/FreeFileSync/Source/lib/icon_buffer.cpp
index e78b308e..db83460d 100644
--- a/lib/icon_buffer.cpp
+++ b/FreeFileSync/Source/lib/icon_buffer.cpp
@@ -14,7 +14,7 @@
#include <zen/dll.h>
#include <zen/win_ver.h>
#include <wx/image.h>
-#include "Thumbnail/thumbnail.h"
+#include "../dll/Thumbnail/thumbnail.h"
#elif defined ZEN_LINUX
#include <gtk/gtk.h>
@@ -28,7 +28,7 @@ using namespace zen;
namespace
{
-const size_t BUFFER_SIZE_MAX = 600; //maximum number of icons to hold in buffer
+const size_t BUFFER_SIZE_MAX = 800; //maximum number of icons to hold in buffer: must be big enough to hold visible icons + preload buffer! Consider OS limit on GDI resources (wxBitmap)!!!
#ifndef NDEBUG
boost::thread::id mainThreadId = boost::this_thread::get_id();
@@ -108,6 +108,7 @@ public:
ZEN_ON_SCOPE_EXIT(IconHolder().swap(*this)); //destroy after extraction
//let wxImage reference data without taking ownership:
+ assert(!handle_->rgb.empty() && !handle_->alpha.empty());
if (!handle_->rgb.empty())
{
wxImage fileIcon(handle_->width, handle_->height, &handle_->rgb[0], true);
@@ -115,7 +116,6 @@ public:
fileIcon.SetAlpha(&handle_->alpha[0], true);
return wxBitmap(fileIcon);
}
- assert(false); //rgb and alpha should never be empty
return wxBitmap();
#endif
}
@@ -409,14 +409,14 @@ public:
boost::unique_lock<boost::mutex> dummy(lockFiles);
while (filesToLoad.empty())
- conditionNewFiles.timed_wait(dummy, boost::posix_time::milliseconds(50)); //interruption point!
+ conditionNewFiles.timed_wait(dummy, boost::posix_time::milliseconds(100)); //interruption point!
Zstring fileName = filesToLoad.back();
filesToLoad.pop_back();
return fileName;
}
- void setWorkload(const std::list<Zstring>& newLoad) //context of main thread
+ void setWorkload(const std::vector<Zstring>& newLoad) //context of main thread
{
assert(boost::this_thread::get_id() == mainThreadId );
{
@@ -438,7 +438,7 @@ public:
}
private:
- std::list<Zstring> filesToLoad; //processes last elements of vector first!
+ std::vector<Zstring> filesToLoad; //processes last elements of vector first!
boost::mutex lockFiles;
boost::condition_variable conditionNewFiles; //signal event: data for processing available
};
@@ -447,23 +447,28 @@ private:
class Buffer
{
public:
+ Buffer() : firstInsertPos(iconList.end()), lastInsertPos(iconList.end()) {}
+
//called by main and worker thread:
- bool hasFileIcon(const Zstring& fileName) const
+ bool hasIcon(const Zstring& fileName) const
{
boost::lock_guard<boost::mutex> dummy(lockIconList);
return iconList.find(fileName) != iconList.end();
}
//must be called by main thread only! => wxBitmap is NOT thread-safe like an int (non-atomic ref-count!!!)
- Opt<wxBitmap> retrieveFileIcon(const Zstring& fileName)
+ Opt<wxBitmap> retrieve(const Zstring& fileName)
{
assert(boost::this_thread::get_id() == mainThreadId);
boost::lock_guard<boost::mutex> dummy(lockIconList);
+
auto it = iconList.find(fileName);
if (it == iconList.end())
return NoValue();
- IconData& idata = it->second;
+ markAsHot(it);
+
+ IconData& idata = refData(it);
if (idata.iconRaw) //if not yet converted...
{
idata.iconFmt = make_unique<wxBitmap>(idata.iconRaw.extractWxBitmap()); //convert in main thread!
@@ -472,37 +477,110 @@ public:
return idata.iconFmt ? *idata.iconFmt : wxNullBitmap; //idata.iconRaw may be inserted as empty from worker thread!
}
+ //called by main and worker thread:
+ void insert(const Zstring& entryName, IconHolder&& icon)
+ {
+ boost::lock_guard<boost::mutex> dummy(lockIconList);
+
+ //thread safety: moving IconHolder is free from side effects, but ~wxBitmap() is NOT! => do NOT delete items from iconList here!
+ auto rc = iconList.insert(std::make_pair(entryName, makeValueObject()));
+ assert(rc.second);
+ if (rc.second) //if insertion took place
+ {
+ refData(rc.first).iconRaw = std::move(icon);
+ priorityListPushBack(rc.first);
+ }
+ }
+
//must be called by main thread only! => ~wxBitmap() is NOT thread-safe!
//call at an appropriate time, e.g. after Workload::setWorkload()
- void limitBufferSize() //critical because GDI resources are limited (e.g. 10000 on XP per process)
+ void limitSize()
{
assert(boost::this_thread::get_id() == mainThreadId);
boost::lock_guard<boost::mutex> dummy(lockIconList);
+
while (iconList.size() > BUFFER_SIZE_MAX)
{
- iconList.erase(iconSequence.front()); //remove oldest element
- iconSequence.pop();
+ auto itDelPos = firstInsertPos;
+ priorityListPopFront();
+ iconList.erase(itDelPos); //remove oldest element
}
}
- //called by main and worker thread:
- void moveIntoBuffer(const Zstring& entryName, IconHolder&& icon)
+private:
+ struct IconData;
+
+#if defined ZEN_WIN || defined ZEN_LINUX
+ typedef std::map<Zstring, IconData, LessFilename> FileIconMap;
+ IconData& refData(FileIconMap::iterator it) { return it->second; }
+ static IconData makeValueObject() { return IconData(); }
+#elif defined ZEN_MAC //workaround libc++ limitation for incomplete types: http://llvm.org/bugs/show_bug.cgi?id=17701
+ typedef std::map<Zstring, std::unique_ptr<IconData>, LessFilename> FileIconMap;
+ static IconData& refData(FileIconMap::iterator it) { return *(it->second); }
+ static std::unique_ptr<IconData> makeValueObject() { return make_unique<IconData>(); }
+#endif
+
+ //call while holding lock:
+ void priorityListPopFront()
{
- boost::lock_guard<boost::mutex> dummy(lockIconList);
+ assert(firstInsertPos!= iconList.end());
+ firstInsertPos = refData(firstInsertPos).next_;
- //thread safety: moving IconHolder is free from side effects, but ~wxBitmap() is NOT! => do NOT delete items from iconList here!
- auto rc = iconList.insert(std::make_pair(entryName, IconData(std::move(icon))));
- if (rc.second) //if insertion took place
- iconSequence.push(entryName); //note: sharing Zstring with IconDB!!!
+ if (firstInsertPos != iconList.end())
+ refData(firstInsertPos).prev_ = iconList.end();
+ else //BUFFER_SIZE_MAX > 0, but still for completeness:
+ lastInsertPos = iconList.end();
+ }
- assert(iconList.size() == iconSequence.size());
+ //call while holding lock:
+ void priorityListPushBack(FileIconMap::iterator it)
+ {
+ if (lastInsertPos == iconList.end())
+ {
+ assert(firstInsertPos == iconList.end());
+ firstInsertPos = lastInsertPos = it;
+ refData(it).prev_ = refData(it).next_ = iconList.end();
+ }
+ else
+ {
+ refData(it).next_ = iconList.end();
+ refData(it).prev_ = lastInsertPos;
+ refData(lastInsertPos).next_ = it;
+ lastInsertPos = it;
+ }
+ }
+
+ //call while holding lock:
+ void markAsHot(FileIconMap::iterator it) //mark existing buffer entry as if newly inserted
+ {
+ assert(it != iconList.end());
+ if (refData(it).next_ != iconList.end())
+ {
+ if (refData(it).prev_ != iconList.end())
+ {
+ refData(refData(it).prev_).next_ = refData(it).next_; //remove somewhere from the middle
+ refData(refData(it).next_).prev_ = refData(it).prev_; //
+ }
+ else
+ {
+ assert(it == firstInsertPos);
+ priorityListPopFront();
+ }
+ priorityListPushBack(it);
+ }
+ else
+ {
+ if (refData(it).prev_ != iconList.end())
+ assert(it == lastInsertPos); //nothing to do
+ else
+ assert(iconList.size() == 1 && it == firstInsertPos && it == lastInsertPos); //nothing to do
+ }
}
-private:
struct IconData
{
- IconData(IconHolder&& tmp) : iconRaw(std::move(tmp)) {}
- IconData(IconData&& tmp) : iconRaw(std::move(tmp.iconRaw)), iconFmt(std::move(tmp.iconFmt)) {}
+ IconData() {}
+ IconData(IconData&& tmp) : iconRaw(std::move(tmp.iconRaw)), iconFmt(std::move(tmp.iconFmt)), prev_(tmp.prev_), next_(tmp.next_) {}
IconHolder iconRaw; //native icon representation: may be used by any thread
@@ -511,11 +589,15 @@ private:
//- prohibit implicit calls to wxBitmap(const wxBitmap&)
//- prohibit calls to ~wxBitmap() and transitively ~IconData()
//- prohibit even wxBitmap() default constructor - better be safe than sorry!
+
+ FileIconMap::iterator prev_; //store list sorted by time of insertion into buffer
+ FileIconMap::iterator next_; //
};
mutable boost::mutex lockIconList;
- std::map<Zstring, IconData, LessFilename> iconList; //shared resource; Zstring is thread-safe like an int
- std::queue<Zstring> iconSequence; //save sequence of buffer entry to delete oldest elements
+ FileIconMap iconList; //shared resource; Zstring is thread-safe like an int
+ FileIconMap::iterator firstInsertPos;
+ FileIconMap::iterator lastInsertPos;
};
//################################################################################################################################################
@@ -563,8 +645,8 @@ void WorkerThread::operator()() //thread entry
const Zstring fileName = workload_->extractNextFile(); //start work: blocks until next icon to load is retrieved
- if (!buffer_->hasFileIcon(fileName)) //perf: workload may contain duplicate entries?
- buffer_->moveIntoBuffer(fileName, getAssociatedIcon(fileName, iconSizeType));
+ if (!buffer_->hasIcon(fileName)) //perf: workload may contain duplicate entries?
+ buffer_->insert(fileName, getAssociatedIcon(fileName, iconSizeType));
}
}
@@ -594,7 +676,7 @@ IconBuffer::IconBuffer(IconSize sz) : pimpl(make_unique<Pimpl>()),
IconBuffer::~IconBuffer()
{
- setWorkload(std::list<Zstring>()); //make sure interruption point is always reached!
+ setWorkload(std::vector<Zstring>()); //make sure interruption point is always reached!
pimpl->worker.interrupt();
pimpl->worker.join(); //we assume precondition "worker.joinable()"!!!
}
@@ -631,7 +713,7 @@ bool IconBuffer::readyForRetrieval(const Zstring& filename)
if (isCheapExtension(getFileExtension(filename)))
return true;
#endif
- return pimpl->buffer->hasFileIcon(filename);
+ return pimpl->buffer->hasIcon(filename);
}
@@ -644,31 +726,33 @@ Opt<wxBitmap> IconBuffer::retrieveFileIcon(const Zstring& filename)
const Zstring& extension = getFileExtension(filename);
if (isCheapExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension
{
- if (Opt<wxBitmap> ico = pimpl->buffer->retrieveFileIcon(extension))
+ if (Opt<wxBitmap> ico = pimpl->buffer->retrieve(extension))
return ico;
//make sure icon is in buffer, even if icon needs not be retrieved!
- pimpl->buffer->moveIntoBuffer(extension, getAssociatedIconByExt(extension, iconSizeType));
+ pimpl->buffer->insert(extension, getAssociatedIconByExt(extension, iconSizeType));
- Opt<wxBitmap> ico = pimpl->buffer->retrieveFileIcon(extension);
+ Opt<wxBitmap> ico = pimpl->buffer->retrieve(extension);
assert(ico);
return ico;
}
}
#endif
- if (Opt<wxBitmap> ico = pimpl->buffer->retrieveFileIcon(filename))
+ if (Opt<wxBitmap> ico = pimpl->buffer->retrieve(filename))
return ico;
//since this icon seems important right now, we don't want to wait until next setWorkload() to start retrieving
pimpl->workload->addToWorkload(filename);
- pimpl->buffer->limitBufferSize();
+ pimpl->buffer->limitSize();
return NoValue();
}
-void IconBuffer::setWorkload(const std::list<Zstring>& load)
+void IconBuffer::setWorkload(const std::vector<Zstring>& load)
{
+ assert(load.size() < BUFFER_SIZE_MAX / 2);
+
pimpl->workload->setWorkload(load); //since buffer can only increase due to new workload,
- pimpl->buffer->limitBufferSize(); //this is the place to impose the limit from main thread!
+ pimpl->buffer->limitSize(); //this is the place to impose the limit from main thread!
}
diff --git a/lib/icon_buffer.h b/FreeFileSync/Source/lib/icon_buffer.h
index efa5179f..e1a475cb 100644
--- a/lib/icon_buffer.h
+++ b/FreeFileSync/Source/lib/icon_buffer.h
@@ -7,7 +7,7 @@
#ifndef ICONBUFFER_H_INCLUDED
#define ICONBUFFER_H_INCLUDED
-#include <list>
+#include <vector>
#include <memory>
#include <zen/zstring.h>
#include <zen/optional.h>
@@ -35,9 +35,9 @@ public:
const wxBitmap& genericDirIcon () { return genDirIcon; }
bool readyForRetrieval(const Zstring& filename);
- Opt<wxBitmap> retrieveFileIcon(const Zstring& filename);
+ Opt<wxBitmap> retrieveFileIcon(const Zstring& filename); //... and mark as hot
- void setWorkload(const std::list<Zstring>& load); //(re-)set new workload of icons to be retrieved;
+ void setWorkload(const std::vector<Zstring>& load); //(re-)set new workload of icons to be retrieved;
private:
struct Pimpl;
diff --git a/lib/localization.cpp b/FreeFileSync/Source/lib/localization.cpp
index 3536ba70..3536ba70 100644
--- a/lib/localization.cpp
+++ b/FreeFileSync/Source/lib/localization.cpp
diff --git a/lib/localization.h b/FreeFileSync/Source/lib/localization.h
index 2d871dd7..2d871dd7 100644
--- a/lib/localization.h
+++ b/FreeFileSync/Source/lib/localization.h
diff --git a/lib/lock_holder.h b/FreeFileSync/Source/lib/lock_holder.h
index 81b5632d..cf4c460e 100644
--- a/lib/lock_holder.h
+++ b/FreeFileSync/Source/lib/lock_holder.h
@@ -21,9 +21,8 @@ public:
bool& warningDirectoryLockFailed,
ProcessCallback& procCallback)
{
- for (auto it = dirnamesExisting.begin(); it != dirnamesExisting.end(); ++it)
+ for (const Zstring& dirnameFmt : dirnamesExisting)
{
- const Zstring& dirnameFmt = *it;
assert(endsWith(dirnameFmt, FILE_NAME_SEPARATOR)); //this is really the contract, formatting does other things as well, e.g. macro substitution
class WaitOnLockHandler : public DirLockCallback
diff --git a/lib/norm_filter.h b/FreeFileSync/Source/lib/norm_filter.h
index 552931e2..552931e2 100644
--- a/lib/norm_filter.h
+++ b/FreeFileSync/Source/lib/norm_filter.h
diff --git a/lib/osx_file_icon.h b/FreeFileSync/Source/lib/osx_file_icon.h
index 5edfd740..5edfd740 100644
--- a/lib/osx_file_icon.h
+++ b/FreeFileSync/Source/lib/osx_file_icon.h
diff --git a/lib/osx_file_icon.mm b/FreeFileSync/Source/lib/osx_file_icon.mm
index fb3c6490..fb3c6490 100644
--- a/lib/osx_file_icon.mm
+++ b/FreeFileSync/Source/lib/osx_file_icon.mm
diff --git a/lib/parallel_scan.cpp b/FreeFileSync/Source/lib/parallel_scan.cpp
index 9c6b16a9..9c6b16a9 100644
--- a/lib/parallel_scan.cpp
+++ b/FreeFileSync/Source/lib/parallel_scan.cpp
diff --git a/lib/parallel_scan.h b/FreeFileSync/Source/lib/parallel_scan.h
index 408882bf..408882bf 100644
--- a/lib/parallel_scan.h
+++ b/FreeFileSync/Source/lib/parallel_scan.h
diff --git a/lib/parse_lng.h b/FreeFileSync/Source/lib/parse_lng.h
index 19a8e751..19a8e751 100644
--- a/lib/parse_lng.h
+++ b/FreeFileSync/Source/lib/parse_lng.h
diff --git a/lib/parse_plural.h b/FreeFileSync/Source/lib/parse_plural.h
index bac933c9..bac933c9 100644
--- a/lib/parse_plural.h
+++ b/FreeFileSync/Source/lib/parse_plural.h
diff --git a/lib/perf_check.cpp b/FreeFileSync/Source/lib/perf_check.cpp
index bf232add..e016bc6c 100644
--- a/lib/perf_check.cpp
+++ b/FreeFileSync/Source/lib/perf_check.cpp
@@ -43,20 +43,19 @@ PerfCheck::~PerfCheck()
}
-void PerfCheck::addSample(int itemsCurrent, double dataCurrent, long timeMs)
+void PerfCheck::addSample(int itemsCurrent, double dataCurrent, int64_t timeMs)
{
samples.insert(samples.end(), std::make_pair(timeMs, Record(itemsCurrent, dataCurrent))); //use fact that time is monotonously ascending
//remove all records earlier than "now - windowMax"
- const long newBegin = timeMs - windowMax;
- auto it = samples.upper_bound(newBegin);
+ auto it = samples.upper_bound(timeMs - windowMax);
if (it != samples.begin())
samples.erase(samples.begin(), --it); //keep one point before newBegin in order to handle "measurement holes"
}
inline
-std::pair<const std::multimap<long, PerfCheck::Record>::value_type*, const std::multimap<long, PerfCheck::Record>::value_type*> PerfCheck::getBlockFromEnd(long windowSize) const
+std::pair<const std::multimap<int64_t, PerfCheck::Record>::value_type*, const std::multimap<int64_t, PerfCheck::Record>::value_type*> PerfCheck::getBlockFromEnd(int64_t windowSize) const
{
if (!samples.empty())
{
@@ -79,8 +78,8 @@ zen::Opt<std::wstring> PerfCheck::getRemainingTime(double dataRemaining) const
const auto& itemFront = *blk.first;
const auto& itemBack = *blk.second;
//-----------------------------------------------------------------------------------------------
- const long timeDelta = itemBack.first - itemFront.first;
- const double dataDelta = itemBack.second.data_ - itemFront.second.data_;
+ const int64_t timeDelta = itemBack.first - itemFront.first;
+ const double dataDelta = itemBack.second.data_ - itemFront.second.data_;
//objects model logical operations *NOT* disk accesses, so we better play safe and use "bytes" only!
//http://sourceforge.net/p/freefilesync/feature-requests/197/
@@ -100,11 +99,11 @@ zen::Opt<std::wstring> PerfCheck::getBytesPerSecond() const
const auto& itemFront = *blk.first;
const auto& itemBack = *blk.second;
//-----------------------------------------------------------------------------------------------
- const long timeDelta = itemBack.first - itemFront.first;
- const double dataDelta = itemBack.second.data_ - itemFront.second.data_;
+ const int64_t timeDelta = itemBack.first - itemFront.first;
+ const double dataDelta = itemBack.second.data_ - itemFront.second.data_;
if (timeDelta != 0/* && dataDelta > 0*/)
- return filesizeToShortString(zen::Int64(dataDelta * 1000.0 / timeDelta)) + _("/sec");
+ return filesizeToShortString(Int64(dataDelta * 1000.0 / timeDelta)) + _("/sec");
}
return NoValue();
}
@@ -118,8 +117,8 @@ zen::Opt<std::wstring> PerfCheck::getItemsPerSecond() const
const auto& itemFront = *blk.first;
const auto& itemBack = *blk.second;
//-----------------------------------------------------------------------------------------------
- const long timeDelta = itemBack.first - itemFront.first;
- const int itemsDelta = itemBack.second.itemCount_ - itemFront.second.itemCount_;
+ const int64_t timeDelta = itemBack.first - itemFront.first;
+ const int itemsDelta = itemBack.second.itemCount_ - itemFront.second.itemCount_;
if (timeDelta != 0)
return replaceCpy(_("%x items/sec"), L"%x", formatThreeDigitPrecision(itemsDelta * 1000.0 / timeDelta));
diff --git a/lib/perf_check.h b/FreeFileSync/Source/lib/perf_check.h
index 9d82be57..894ba31d 100644
--- a/lib/perf_check.h
+++ b/FreeFileSync/Source/lib/perf_check.h
@@ -7,6 +7,7 @@
#ifndef STATISTICS_H_INCLUDED
#define STATISTICS_H_INCLUDED
+#include <cstdint>
#include <map>
#include <string>
#include <zen/optional.h>
@@ -18,7 +19,7 @@ public:
unsigned int windowSizeSpeed); //
~PerfCheck();
- void addSample(int itemsCurrent, double dataCurrent, long timeMs); //timeMs must be ascending!
+ void addSample(int itemsCurrent, double dataCurrent, int64_t timeMs); //timeMs must be ascending!
zen::Opt<std::wstring> getRemainingTime(double dataRemaining) const;
zen::Opt<std::wstring> getBytesPerSecond() const; //for window
@@ -32,14 +33,14 @@ private:
double data_; //unit: [bytes]
};
- std::pair<const std::multimap<long, Record>::value_type*,
- const std::multimap<long, Record>::value_type*> getBlockFromEnd(long windowSize) const;
+ std::pair<const std::multimap<int64_t, Record>::value_type*,
+ const std::multimap<int64_t, Record>::value_type*> getBlockFromEnd(int64_t windowSize) const;
- const long windowSizeRemTime; //unit: [ms]
- const long windowSizeSpeed_; //
- const long windowMax;
+ const int64_t windowSizeRemTime; //unit: [ms]
+ const int64_t windowSizeSpeed_; //
+ const int64_t windowMax;
- std::map<long, Record> samples; //time, unit: [ms]
+ std::map<int64_t, Record> samples; //time, unit: [ms]
};
#endif // STATISTICS_H_INCLUDED
diff --git a/lib/process_xml.cpp b/FreeFileSync/Source/lib/process_xml.cpp
index 3e3e72f1..3bf4d81b 100644
--- a/lib/process_xml.cpp
+++ b/FreeFileSync/Source/lib/process_xml.cpp
@@ -26,7 +26,7 @@ const int XML_FORMAT_VER_FFS_BATCH = 3; //
//-------------------------------------------------------------------------------------------------------------------------------
}
-XmlType getXmlType(const zen::XmlDoc& doc) //throw()
+XmlType getXmlTypeNoThrow(const zen::XmlDoc& doc) //throw()
{
if (doc.root().getNameAs<std::string>() == "FreeFileSync")
{
@@ -45,18 +45,11 @@ XmlType getXmlType(const zen::XmlDoc& doc) //throw()
}
-XmlType xmlAccess::getXmlType(const Zstring& filename) //throw()
+XmlType xmlAccess::getXmlType(const Zstring& filename) //throw FfsXmlError
{
- try
- {
- //do NOT use zen::loadStream as it will needlessly load even huge files!
- XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError, quick exit if file is not an FFS XML
- return ::getXmlType(doc);
- }
- catch (const FfsXmlError&)
- {
- return XML_TYPE_OTHER;
- }
+ //do NOT use zen::loadStream as it will needlessly load even huge files!
+ XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError, quick exit if file is not an FFS XML
+ return ::getXmlTypeNoThrow(doc);
}
@@ -154,6 +147,7 @@ xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatchPreservingExistingBatch(co
return batchCfg;
}
catch (xmlAccess::FfsXmlError&) {}
+ warn_static("not good enough")
return convertGuiToBatch(guiCfg);
}
@@ -928,8 +922,8 @@ void readConfig(const XmlIn& in, FilterConfig& filter)
void readConfig(const XmlIn& in, FolderPairEnh& enhPair)
{
//read folder pairs
- in["Left" ](enhPair.leftDirectory);
- in["Right"](enhPair.rightDirectory);
+ in["Left" ](enhPair.dirnamePhraseLeft);
+ in["Right"](enhPair.dirnamePhraseRight);
//###########################################################
//alternate comp configuration (optional)
@@ -1146,8 +1140,12 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config)
//external applications
inGui["ExternalApplications"](config.gui.externelApplications);
+ warn_static("remove after migration: cleanup the old placeholder syntax") //26.10.2013
+ if (std::any_of(config.gui.externelApplications.begin(), config.gui.externelApplications.end(), [](const std::pair<Description, Commandline>& ea) { return contains(ea.second, L"%name") || contains(ea.second, L"%nameCo") || contains(ea.second, L"%dir") || contains(ea.second, L"%dirCo"); }))
+ config.gui.externelApplications = XmlGlobalSettings().gui.externelApplications;
+
//last update check
- inGui["LastVersionCheck"](config.gui.lastUpdateCheck);
+ inGui["LastOnlineCheck"](config.gui.lastUpdateCheck);
//batch specific global settings
//XmlIn inBatch = in["Batch"];
@@ -1168,7 +1166,7 @@ void readConfig(const Zstring& filename, XmlType type, ConfigType& cfg, int curr
{
XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError
- if (getXmlType(doc) != type) //throw()
+ if (getXmlTypeNoThrow(doc) != type) //throw()
throw FfsXmlError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filename)));
XmlIn in(doc);
@@ -1255,7 +1253,7 @@ void xmlAccess::readAnyConfig(const std::vector<Zstring>& filenames, XmlGuiConfi
XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError
//do NOT use zen::loadStream as it will superfluously load even huge files!
- switch (::getXmlType(doc))
+ switch (getXmlTypeNoThrow(doc))
{
case XML_TYPE_GUI:
{
@@ -1346,8 +1344,8 @@ void writeConfigFolderPair(const FolderPairEnh& enhPair, XmlOut& out)
XmlOut outPair = out.ref().addChild("Pair");
//read folder pairs
- outPair["Left" ](enhPair.leftDirectory);
- outPair["Right"](enhPair.rightDirectory);
+ outPair["Left" ](enhPair.dirnamePhraseLeft);
+ outPair["Right"](enhPair.dirnamePhraseRight);
//###########################################################
//alternate comp configuration (optional)
@@ -1529,7 +1527,7 @@ void writeConfig(const XmlGlobalSettings& config, XmlOut& out)
outGui["ExternalApplications"](config.gui.externelApplications);
//last update check
- outGui["LastVersionCheck"](config.gui.lastUpdateCheck);
+ outGui["LastOnlineCheck"](config.gui.lastUpdateCheck);
//batch specific global settings
//XmlOut outBatch = out["Batch"];
diff --git a/lib/process_xml.h b/FreeFileSync/Source/lib/process_xml.h
index 4092c072..046cbca2 100644
--- a/lib/process_xml.h
+++ b/FreeFileSync/Source/lib/process_xml.h
@@ -25,7 +25,7 @@ enum XmlType
XML_TYPE_OTHER
};
-XmlType getXmlType(const Zstring& filename); //throw()
+XmlType getXmlType(const Zstring& filename); //throw FfsXmlError
enum OnError
diff --git a/lib/resolve_path.cpp b/FreeFileSync/Source/lib/resolve_path.cpp
index 768876c9..768876c9 100644
--- a/lib/resolve_path.cpp
+++ b/FreeFileSync/Source/lib/resolve_path.cpp
diff --git a/lib/resolve_path.h b/FreeFileSync/Source/lib/resolve_path.h
index b9c7196f..b9c7196f 100644
--- a/lib/resolve_path.h
+++ b/FreeFileSync/Source/lib/resolve_path.h
diff --git a/lib/return_codes.h b/FreeFileSync/Source/lib/return_codes.h
index a37e11f2..a37e11f2 100644
--- a/lib/return_codes.h
+++ b/FreeFileSync/Source/lib/return_codes.h
diff --git a/lib/shadow.cpp b/FreeFileSync/Source/lib/shadow.cpp
index d1027f69..8a30bd3f 100644
--- a/lib/shadow.cpp
+++ b/FreeFileSync/Source/lib/shadow.cpp
@@ -12,7 +12,7 @@
#include <zen/assert_static.h>
#include <zen/long_path_prefix.h>
#include <zen/symlink_target.h>
-#include "ShadowCopy/shadow.h"
+#include "../dll/ShadowCopy/shadow.h"
#include <zen/scope_guard.h>
using namespace zen;
diff --git a/lib/shadow.h b/FreeFileSync/Source/lib/shadow.h
index 36c72c25..36c72c25 100644
--- a/lib/shadow.h
+++ b/FreeFileSync/Source/lib/shadow.h
diff --git a/lib/soft_filter.h b/FreeFileSync/Source/lib/soft_filter.h
index 010a8913..010a8913 100644
--- a/lib/soft_filter.h
+++ b/FreeFileSync/Source/lib/soft_filter.h
diff --git a/lib/status_handler.cpp b/FreeFileSync/Source/lib/status_handler.cpp
index 5fb80161..5fb80161 100644
--- a/lib/status_handler.cpp
+++ b/FreeFileSync/Source/lib/status_handler.cpp
diff --git a/lib/status_handler.h b/FreeFileSync/Source/lib/status_handler.h
index 9a288b6f..baf772d3 100644
--- a/lib/status_handler.h
+++ b/FreeFileSync/Source/lib/status_handler.h
@@ -69,26 +69,26 @@ protected:
virtual void updateProcessedData(int objectsDelta, Int64 dataDelta) { updateData(numbersCurrent_, objectsDelta, dataDelta); } //note: these methods MUST NOT throw in order
virtual void updateTotalData (int objectsDelta, Int64 dataDelta) { updateData(numbersTotal_ , objectsDelta, dataDelta); } //to properly allow undoing setting of statistics!
- virtual void requestUiRefresh()
+ virtual void requestUiRefresh() //throw X
{
if (abortRequested) //triggered by requestAbortion()
{
forceUiRefresh();
- abortThisProcess();
+ abortProcessNow(); //throw X
}
else if (updateUiIsAllowed()) //test if specific time span between ui updates is over
forceUiRefresh();
}
- virtual void reportStatus(const std::wstring& text) { statusText_ = text; requestUiRefresh(); /*throw AbortThisProcess */ }
- virtual void reportInfo (const std::wstring& text) { statusText_ = text; requestUiRefresh(); /*throw AbortThisProcess */ } //log text in derived class
+ virtual void reportStatus(const std::wstring& text) { statusText_ = text; requestUiRefresh(); /*throw X */ }
+ virtual void reportInfo (const std::wstring& text) { statusText_ = text; requestUiRefresh(); /*throw X */ } //log text in derived class
//implement AbortCallback
virtual void requestAbortion()
{
abortRequested = true;
- statusText_ =_("Stop requested: Waiting for current operation to finish...");
- } //this does NOT call abortThisProcess immediately, but when we're out of the C GUI call stack
+ statusText_ = _("Stop requested: Waiting for current operation to finish...");
+ } //this does NOT call abortProcessNow() immediately, but when we're out of the C GUI call stack
//implement Statistics
virtual Phase currentPhase() const { return currentPhase_; }
@@ -101,9 +101,6 @@ protected:
virtual const std::wstring& currentStatusText() const { return statusText_; }
- //enrich this interface
- virtual void abortThisProcess() = 0;
-
bool abortIsRequested() const { return abortRequested; }
private:
diff --git a/lib/status_handler_impl.h b/FreeFileSync/Source/lib/status_handler_impl.h
index 210e6ecd..6b364ba3 100644
--- a/lib/status_handler_impl.h
+++ b/FreeFileSync/Source/lib/status_handler_impl.h
@@ -9,7 +9,7 @@
#include <zen/optional.h>
#include <zen/file_error.h>
-#include "process_callback.h"
+#include "../process_callback.h"
template <typename Function> inline
diff --git a/lib/versioning.cpp b/FreeFileSync/Source/lib/versioning.cpp
index 82696e3a..82696e3a 100644
--- a/lib/versioning.cpp
+++ b/FreeFileSync/Source/lib/versioning.cpp
diff --git a/lib/versioning.h b/FreeFileSync/Source/lib/versioning.h
index 06065656..06065656 100644
--- a/lib/versioning.h
+++ b/FreeFileSync/Source/lib/versioning.h
diff --git a/lib/xml_base.cpp b/FreeFileSync/Source/lib/xml_base.cpp
index f504d19a..f504d19a 100644
--- a/lib/xml_base.cpp
+++ b/FreeFileSync/Source/lib/xml_base.cpp
diff --git a/lib/xml_base.h b/FreeFileSync/Source/lib/xml_base.h
index 85d4dfa1..85d4dfa1 100644
--- a/lib/xml_base.h
+++ b/FreeFileSync/Source/lib/xml_base.h
diff --git a/process_callback.h b/FreeFileSync/Source/process_callback.h
index cbd9437f..fb9648fe 100644
--- a/process_callback.h
+++ b/FreeFileSync/Source/process_callback.h
@@ -69,6 +69,8 @@ struct ProcessCallback
};
virtual Response reportError (const std::wstring& errorMessage, size_t retryNumber) = 0; //recoverable error situation
virtual void reportFatalError(const std::wstring& errorMessage) = 0; //non-recoverable error situation
+
+ virtual void abortProcessNow() = 0; //will throw an exception => don't call while in a C GUI callstack
};
#endif //PROC_HEADER_48257827842345454545
diff --git a/structures.cpp b/FreeFileSync/Source/structures.cpp
index e5dc08fd..04edf537 100644
--- a/structures.cpp
+++ b/FreeFileSync/Source/structures.cpp
@@ -398,7 +398,7 @@ bool effectivelyEmpty(const FolderPairEnh& fp)
trim(dirname);
return dirname.empty();
};
- return isEmpty(fp.leftDirectory) && isEmpty(fp.rightDirectory);
+ return isEmpty(fp.dirnamePhraseLeft) && isEmpty(fp.dirnamePhraseRight);
}
}
diff --git a/structures.h b/FreeFileSync/Source/structures.h
index fdf36e09..eeaf3f77 100644
--- a/structures.h
+++ b/FreeFileSync/Source/structures.h
@@ -333,19 +333,19 @@ struct FolderPairEnh //enhanced folder pairs with (optional) alternate configura
{
FolderPairEnh() {}
- FolderPairEnh(const Zstring& leftDir,
- const Zstring& rightDir,
+ FolderPairEnh(const Zstring& phraseLeft,
+ const Zstring& phraseRight,
const std::shared_ptr<const CompConfig>& cmpConfig,
const std::shared_ptr<const SyncConfig>& syncConfig,
const FilterConfig& filter) :
- leftDirectory(leftDir),
- rightDirectory(rightDir) ,
+ dirnamePhraseLeft (phraseLeft),
+ dirnamePhraseRight(phraseRight),
altCmpConfig(cmpConfig),
altSyncConfig(syncConfig),
localFilter(filter) {}
- Zstring leftDirectory;
- Zstring rightDirectory;
+ Zstring dirnamePhraseLeft; //unresolved directory names as entered by user!
+ Zstring dirnamePhraseRight; //
std::shared_ptr<const CompConfig> altCmpConfig; //optional
std::shared_ptr<const SyncConfig> altSyncConfig; //
@@ -356,8 +356,8 @@ struct FolderPairEnh //enhanced folder pairs with (optional) alternate configura
inline
bool operator==(const FolderPairEnh& lhs, const FolderPairEnh& rhs)
{
- return lhs.leftDirectory == rhs.leftDirectory &&
- lhs.rightDirectory == rhs.rightDirectory &&
+ return lhs.dirnamePhraseLeft == rhs.dirnamePhraseLeft &&
+ lhs.dirnamePhraseRight == rhs.dirnamePhraseRight &&
(lhs.altCmpConfig.get() && rhs.altCmpConfig.get() ?
*lhs.altCmpConfig == *rhs.altCmpConfig :
diff --git a/synchronization.cpp b/FreeFileSync/Source/synchronization.cpp
index f5785b1a..fbb7a499 100644
--- a/synchronization.cpp
+++ b/FreeFileSync/Source/synchronization.cpp
@@ -283,6 +283,8 @@ std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration&
//------------------------------------------------------------------------------------------------------------
+namespace
+{
//test if user accidentally selected the wrong folders to sync
bool significantDifferenceDetected(const SyncStatistics& folderPairStat)
{
@@ -410,8 +412,6 @@ DeletionHandling::DeletionHandling(DeletionPolicy handleDel, //nothrow!
#ifdef ZEN_WIN
-namespace
-{
class CallbackMassRecycling : public CallbackRecycling
{
public:
@@ -432,7 +432,7 @@ private:
ProcessCallback& statusHandler_;
const std::wstring txtRecyclingFile;
};
-}
+
//create + returns temporary directory postfixed with file name separator
//to support later cleanup if automatic deletion fails for whatever reason
@@ -530,8 +530,6 @@ void DeletionHandling::tryCleanup(bool allowUserCallback) //throw FileError; thr
}
-namespace
-{
template <class Function>
struct CallbackRemoveDirImpl : public CallbackRemoveDir
{
@@ -597,7 +595,6 @@ private:
const std::wstring txtMovingFile;
const std::wstring txtMovingFolder;
};
-}
template <class Function>
@@ -786,8 +783,6 @@ void DeletionHandling::removeLinkUpdating(const Zstring& fullName, const Zstring
//------------------------------------------------------------------------------------------------------------
-namespace
-{
/*
DELETE_PERMANENTLY: deletion frees space
DELETE_TO_RECYCLER: won't free space until recycler is full, but then frees space
@@ -815,37 +810,37 @@ private:
//don't process directories
//process files
- for (auto it = hierObj.refSubFiles().begin(); it != hierObj.refSubFiles().end(); ++it)
- switch (it->getSyncOperation()) //evaluate comparison result and sync direction
+ for (const FilePair& fileObj : hierObj.refSubFiles())
+ switch (fileObj.getSyncOperation()) //evaluate comparison result and sync direction
{
case SO_CREATE_NEW_LEFT:
- spaceNeededLeft += to<Int64>(it->getFileSize<RIGHT_SIDE>());
+ spaceNeededLeft += to<Int64>(fileObj.getFileSize<RIGHT_SIDE>());
break;
case SO_CREATE_NEW_RIGHT:
- spaceNeededRight += to<Int64>(it->getFileSize<LEFT_SIDE>());
+ spaceNeededRight += to<Int64>(fileObj.getFileSize<LEFT_SIDE>());
break;
case SO_DELETE_LEFT:
//if (freeSpaceDelLeft_)
- spaceNeededLeft -= to<Int64>(it->getFileSize<LEFT_SIDE>());
+ spaceNeededLeft -= to<Int64>(fileObj.getFileSize<LEFT_SIDE>());
break;
case SO_DELETE_RIGHT:
//if (freeSpaceDelRight_)
- spaceNeededRight -= to<Int64>(it->getFileSize<RIGHT_SIDE>());
+ spaceNeededRight -= to<Int64>(fileObj.getFileSize<RIGHT_SIDE>());
break;
case SO_OVERWRITE_LEFT:
//if (freeSpaceDelLeft_)
- spaceNeededLeft -= to<Int64>(it->getFileSize<LEFT_SIDE>());
- spaceNeededLeft += to<Int64>(it->getFileSize<RIGHT_SIDE>());
+ spaceNeededLeft -= to<Int64>(fileObj.getFileSize<LEFT_SIDE>());
+ spaceNeededLeft += to<Int64>(fileObj.getFileSize<RIGHT_SIDE>());
break;
case SO_OVERWRITE_RIGHT:
//if (freeSpaceDelRight_)
- spaceNeededRight -= to<Int64>(it->getFileSize<RIGHT_SIDE>());
- spaceNeededRight += to<Int64>(it->getFileSize<LEFT_SIDE>());
+ spaceNeededRight -= to<Int64>(fileObj.getFileSize<RIGHT_SIDE>());
+ spaceNeededRight += to<Int64>(fileObj.getFileSize<LEFT_SIDE>());
break;
case SO_DO_NOTHING:
@@ -953,7 +948,7 @@ private:
};
template <class Function>
- FileAttrib copyFileUpdating(const Zstring& sourceFile, const Zstring& targetFile, const Int64& bytesExpected, Function delTargetCommand) const; //throw FileError; reports data delta via updateProcessedData()
+ InSyncAttributes copyFileUpdating(const Zstring& sourceFile, const Zstring& targetFile, const Int64& bytesExpected, Function delTargetCommand) const; //throw FileError; reports data delta via updateProcessedData()
void verifyFileCopy(const Zstring& source, const Zstring& target) const;
template <SelectedSide side>
@@ -988,7 +983,6 @@ DeletionHandling& SynchronizeFolderPair::getDelHandling<LEFT_SIDE>() { return de
template <> inline
DeletionHandling& SynchronizeFolderPair::getDelHandling<RIGHT_SIDE>() { return delHandlingRight_; }
-}
/*
__________________________
@@ -1019,8 +1013,6 @@ III) c -> d caveat: move-sequence needs to be processed in correct order!
a -> b/a
*/
-namespace
-{
template <class List> inline
bool haveNameClash(const Zstring& shortname, List& m)
{
@@ -1039,7 +1031,6 @@ Zstring findUnusedTempName(const Zstring& filename)
return output;
}
-}
template <SelectedSide side>
@@ -1164,19 +1155,18 @@ void SynchronizeFolderPair::manageFileMove(FilePair& sourceObj,
//search for file move-operations
void SynchronizeFolderPair::runZeroPass(HierarchyObject& hierObj)
{
- for (auto it = hierObj.refSubFiles().begin(); it != hierObj.refSubFiles().end(); ++it) //VS 2010 crashes if we use for_each + lambda here...
+ for (FilePair& fileObj : hierObj.refSubFiles())
{
- FilePair& fileObj = *it;
-
const SyncOperation syncOp = fileObj.getSyncOperation();
switch (syncOp) //evaluate comparison result and sync direction
{
case SO_MOVE_LEFT_SOURCE:
case SO_MOVE_RIGHT_SOURCE:
- {
- FilePair* sourceObj = &fileObj;
if (FilePair* targetObj = dynamic_cast<FilePair*>(FileSystemObject::retrieve(fileObj.getMoveRef())))
{
+ FilePair* sourceObj = &fileObj;
+ assert(dynamic_cast<FilePair*>(FileSystemObject::retrieve(targetObj->getMoveRef())) == sourceObj);
+
zen::Opt<std::wstring> errMsg = tryReportingError([&]
{
if (syncOp == SO_MOVE_LEFT_SOURCE)
@@ -1207,8 +1197,8 @@ void SynchronizeFolderPair::runZeroPass(HierarchyObject& hierObj)
procCallback_.updateTotalData(statAfter.first - statBefore.first, statAfter.second - statBefore.second);
}
}
- }
- break;
+ break;
+
case SO_MOVE_LEFT_TARGET: //it's enough to try each move-pair *once*
case SO_MOVE_RIGHT_TARGET: //
case SO_DELETE_LEFT:
@@ -1226,8 +1216,8 @@ void SynchronizeFolderPair::runZeroPass(HierarchyObject& hierObj)
}
}
- std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(),
- [&](DirPair& dirObj) { this->runZeroPass(dirObj); /*recurse */ });
+ for (DirPair& dirObj : hierObj.refSubDirs())
+ runZeroPass(dirObj); //recurse
}
//---------------------------------------------------------------------------------------------------------------
@@ -1363,8 +1353,6 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj)
//---------------------------------------------------------------------------------------------------------------
-namespace
-{
inline
Opt<SelectedSide> getTargetDirection(SyncOperation syncOp)
{
@@ -1393,7 +1381,6 @@ Opt<SelectedSide> getTargetDirection(SyncOperation syncOp)
}
return NoValue();
}
-}
inline
@@ -1430,9 +1417,9 @@ void SynchronizeFolderPair::synchronizeFileInt(FilePair& fileObj, SyncOperation
try
{
- const FileAttrib newAttr = copyFileUpdating(fileObj.getFullName<sideSrc>(),
- target,
- to<Int64>(fileObj.getFileSize<sideSrc>()), [] {} /*no target to delete*/); //throw FileError
+ const InSyncAttributes newAttr = copyFileUpdating(fileObj.getFullName<sideSrc>(),
+ target,
+ to<Int64>(fileObj.getFileSize<sideSrc>()), [] {} /*no target to delete*/); //throw FileError
//update FilePair
fileObj.setSyncedTo<sideTrg>(fileObj.getShortName<sideSrc>(), newAttr.fileSize,
newAttr.modificationTime, //target time set from source
@@ -1522,10 +1509,10 @@ void SynchronizeFolderPair::synchronizeFileInt(FilePair& fileObj, SyncOperation
renameFile(fileObj.getFullName<sideTrg>(),
beforeLast(fileObj.getFullName<sideTrg>(), FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileObj.getShortName<sideSrc>()); //throw FileError
- const FileAttrib newAttr = copyFileUpdating(fileObj.getFullName<sideSrc>(),
- targetFile,
- to<Int64>(fileObj.getFileSize<sideSrc>()),
- [&] //delete target at appropriate time
+ const InSyncAttributes newAttr = copyFileUpdating(fileObj.getFullName<sideSrc>(),
+ targetFile,
+ to<Int64>(fileObj.getFileSize<sideSrc>()),
+ [&] //delete target at appropriate time
{
reportStatus(this->getDelHandling<sideTrg>().getTxtRemovingFile(), targetFile);
@@ -1555,7 +1542,6 @@ void SynchronizeFolderPair::synchronizeFileInt(FilePair& fileObj, SyncOperation
case SO_COPY_METADATA_TO_LEFT:
case SO_COPY_METADATA_TO_RIGHT:
- {
//harmonize with file_hierarchy.cpp::getSyncOpDescription!!
reportInfo(txtWritingAttributes, fileObj.getFullName<sideTrg>());
@@ -1579,11 +1565,10 @@ void SynchronizeFolderPair::synchronizeFileInt(FilePair& fileObj, SyncOperation
fileObj.isFollowedSymlink<sideSrc>());
procCallback_.updateProcessedData(1, 0);
- }
break;
- case SO_MOVE_LEFT_SOURCE:
- case SO_MOVE_RIGHT_SOURCE:
+ case SO_MOVE_LEFT_SOURCE: //use SO_MOVE_LEFT_TARGET/SO_MOVE_RIGHT_TARGET to execute move:
+ case SO_MOVE_RIGHT_SOURCE: //=> makes sure parent directory has been created
case SO_DO_NOTHING:
case SO_EQUAL:
case SO_UNRESOLVED_CONFLICT:
@@ -1844,9 +1829,188 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirPair& dirObj, SyncOperation
procCallback_.requestUiRefresh(); //may throw
}
+//###########################################################################################
-namespace
+template <class Function>
+class WhileCopying : public zen::CallbackCopyFile
+{
+public:
+ WhileCopying(Int64& bytesReported,
+ ProcessCallback& statusHandler,
+ Function delTargetCmd) :
+ bytesReported_(bytesReported),
+ statusHandler_(statusHandler),
+ delTargetCmd_(std::move(delTargetCmd)) {}
+
+ virtual void deleteTargetFile(const Zstring& targetFile) { delTargetCmd_(); }
+
+ virtual void updateCopyStatus(Int64 bytesDelta)
+ {
+ statusHandler_.updateProcessedData(0, bytesDelta); //throw()! -> ensure client and service provider are in sync!
+ bytesReported_ += bytesDelta; //
+
+ statusHandler_.requestUiRefresh(); //may throw
+ }
+
+private:
+ Int64& bytesReported_;
+ ProcessCallback& statusHandler_;
+ Function delTargetCmd_;
+};
+
+
+//throw FileError; reports data delta via updateProcessedData()
+template <class Function>
+InSyncAttributes SynchronizeFolderPair::copyFileUpdating(const Zstring& sourceFile,
+ const Zstring& targetFile,
+ const Int64& bytesExpected,
+ Function delTargetCommand) const //returns current attributes of source file
+{
+ Zstring source = sourceFile;
+ InSyncAttributes newAttr;
+ Int64 bytesReported;
+
+ auto copyOperation = [&]
+ {
+ auto guardStatistics = makeGuard([&]
+ {
+ procCallback_.updateTotalData(0, bytesReported); //error = unexpected increase of total workload
+ bytesReported = 0;
+ });
+
+ WhileCopying<Function> callback(bytesReported, procCallback_, delTargetCommand);
+
+ copyFile(source, //type File implicitly means symlinks need to be dereferenced!
+ targetFile,
+ copyFilePermissions_,
+ transactionalFileCopy_,
+ &callback,
+ &newAttr); //throw FileError, ErrorFileLocked
+
+ //#################### Verification #############################
+ if (verifyCopiedFiles_)
+ {
+ auto guardTarget = makeGuard([&] { removeFile(targetFile); }); //delete target if verification fails
+ verifyFileCopy(source, targetFile); //throw FileError
+ guardTarget.dismiss();
+ }
+ //#################### /Verification #############################
+
+ //update statistics to consider the real amount of data, e.g. more than the "file size" for ADS streams,
+ //less for sparse and compressed files, or file changed in the meantime!
+ if (bytesReported != bytesExpected)
+ procCallback_.updateTotalData(0, bytesReported - bytesExpected); //noexcept!
+
+ guardStatistics.dismiss();
+ };
+
+#ifdef ZEN_WIN
+ try
+ {
+ copyOperation();
+ }
+ catch (ErrorFileLocked& e1)
+ {
+ //if file is locked (try to) use Windows Volume Shadow Copy Service
+ if (!shadowCopyHandler_)
+ throw;
+ try
+ {
+ //contains prefix: E.g. "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Program Files\FFS\sample.dat"
+ source = shadowCopyHandler_->makeShadowCopy(source, //throw FileError
+ [&](const Zstring& volumeName)
+ {
+ procCallback_.reportStatus(replaceCpy(_("Creating a Volume Shadow Copy for %x..."), L"%x", fmtFileName(volumeName)));
+ procCallback_.forceUiRefresh();
+ });
+ }
+ catch (const FileError& e2)
+ {
+ throw FileError(e1.toString(), e2.toString());
+ }
+
+ //now try again
+ copyOperation();
+ }
+#else
+ copyOperation();
+#endif
+
+ return newAttr;
+}
+
+//--------------------- data verification -------------------------
+struct VerifyCallback
+{
+ virtual ~VerifyCallback() {}
+ virtual void updateStatus() = 0;
+};
+
+void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback& callback) //throw FileError
+{
+ static std::vector<char> memory1(1024 * 1024); //1024 kb seems to be a reasonable buffer size
+ static std::vector<char> memory2(1024 * 1024);
+
+#ifdef ZEN_WIN
+ wxFile file1(applyLongPathPrefix(source).c_str(), wxFile::read); //don't use buffered file input for verification!
+#elif defined ZEN_LINUX || defined ZEN_MAC
+ wxFile file1(::open(source.c_str(), O_RDONLY)); //utilize UTF-8 filename
+#endif
+ if (!file1.IsOpened())
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source)) + L" (open)");
+
+#ifdef ZEN_WIN
+ wxFile file2(applyLongPathPrefix(target).c_str(), wxFile::read); //don't use buffered file input for verification!
+#elif defined ZEN_LINUX || defined ZEN_MAC
+ wxFile file2(::open(target.c_str(), O_RDONLY)); //utilize UTF-8 filename
+#endif
+ if (!file2.IsOpened()) //NO cleanup necessary for (wxFile) file1
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target)) + L" (open)");
+
+ do
+ {
+ const size_t length1 = file1.Read(&memory1[0], memory1.size());
+ if (file1.Error())
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source)));
+ callback.updateStatus();
+
+ const size_t length2 = file2.Read(&memory2[0], memory2.size());
+ if (file2.Error())
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target)));
+ callback.updateStatus();
+
+ if (length1 != length2 || ::memcmp(&memory1[0], &memory2[0], length1) != 0)
+ throw FileError(replaceCpy(replaceCpy(_("Data verification error: %x and %y have different content."), L"%x", L"\n" + fmtFileName(source)), L"%y", L"\n" + fmtFileName(target)));
+ }
+ while (!file1.Eof());
+
+ if (!file2.Eof())
+ throw FileError(replaceCpy(replaceCpy(_("Data verification error: %x and %y have different content."), L"%x", L"\n" + fmtFileName(source)), L"%y", L"\n" + fmtFileName(target)));
+}
+
+
+class VerifyStatusUpdater : public VerifyCallback
+{
+public:
+ VerifyStatusUpdater(ProcessCallback& statusHandler) : statusHandler_(statusHandler) {}
+
+ virtual void updateStatus() { statusHandler_.requestUiRefresh(); } //trigger display refresh
+
+private:
+ ProcessCallback& statusHandler_;
+};
+
+
+void SynchronizeFolderPair::verifyFileCopy(const Zstring& source, const Zstring& target) const
{
+ procCallback_.reportInfo(replaceCpy(txtVerifying, L"%x", fmtFileName(target)));
+
+ VerifyStatusUpdater callback(procCallback_);
+ tryReportingError([&] { verifyFiles(source, target, callback); }, procCallback_);
+}
+
+//###########################################################################################
+
#ifdef ZEN_WIN
//recycleBinStatus() blocks seriously if recycle bin is really full and drive is slow
StatusRecycler recycleBinStatusUpdating(const Zstring& dirname, ProcessCallback& procCallback)
@@ -1941,9 +2105,8 @@ void zen::synchronize(const TimeComp& timeStamp,
{
backgroundPrio = make_unique<ScheduleForBackgroundProcessing>(); //throw FileError
}
- catch (const FileError& e)
+ catch (const FileError& e) //not an error in this context
{
- //not an error in this context
callback.reportInfo(e.toString()); //may throw!
}
@@ -1953,9 +2116,8 @@ void zen::synchronize(const TimeComp& timeStamp,
{
noStandby = make_unique<PreventStandby>(); //throw FileError
}
- catch (const FileError& e)
+ catch (const FileError& e) //not an error in this context
{
- //not an error in this context
callback.reportInfo(e.toString()); //may throw!
}
@@ -2354,183 +2516,4 @@ void zen::synchronize(const TimeComp& timeStamp,
{
callback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
}
-}
-
-//###########################################################################################
-
-template <class Function>
-class WhileCopying : public zen::CallbackCopyFile
-{
-public:
- WhileCopying(Int64& bytesReported,
- ProcessCallback& statusHandler,
- Function delTargetCmd) :
- bytesReported_(bytesReported),
- statusHandler_(statusHandler),
- delTargetCmd_(std::move(delTargetCmd)) {}
-
- virtual void deleteTargetFile(const Zstring& targetFile) { delTargetCmd_(); }
-
- virtual void updateCopyStatus(Int64 bytesDelta)
- {
- statusHandler_.updateProcessedData(0, bytesDelta); //throw()! -> ensure client and service provider are in sync!
- bytesReported_ += bytesDelta; //
-
- statusHandler_.requestUiRefresh(); //may throw
- }
-
-private:
- Int64& bytesReported_;
- ProcessCallback& statusHandler_;
- Function delTargetCmd_;
-};
-
-
-//throw FileError; reports data delta via updateProcessedData()
-template <class Function>
-FileAttrib SynchronizeFolderPair::copyFileUpdating(const Zstring& sourceFile,
- const Zstring& targetFile, const Int64& bytesExpected, Function delTargetCommand) const //returns current attributes of source file
-{
- Zstring source = sourceFile;
- FileAttrib newAttr;
- Int64 bytesReported;
-
- auto copyOperation = [&]
- {
- auto guardStatistics = makeGuard([&]
- {
- procCallback_.updateTotalData(0, bytesReported); //error = unexpected increase of total workload
- bytesReported = 0;
- });
-
- WhileCopying<Function> callback(bytesReported, procCallback_, delTargetCommand);
-
- copyFile(source, //type File implicitly means symlinks need to be dereferenced!
- targetFile,
- copyFilePermissions_,
- transactionalFileCopy_,
- &callback,
- &newAttr); //throw FileError, ErrorFileLocked
-
- //#################### Verification #############################
- if (verifyCopiedFiles_)
- {
- auto guardTarget = makeGuard([&] { removeFile(targetFile); }); //delete target if verification fails
- verifyFileCopy(source, targetFile); //throw FileError
- guardTarget.dismiss();
- }
- //#################### /Verification #############################
-
- //update statistics to consider the real amount of data, e.g. more than the "file size" for ADS streams,
- //less for sparse and compressed files, or file changed in the meantime!
- if (bytesReported != bytesExpected)
- procCallback_.updateTotalData(0, bytesReported - bytesExpected); //noexcept!
-
- guardStatistics.dismiss();
- };
-
-#ifdef ZEN_WIN
- try
- {
- copyOperation();
- }
- catch (ErrorFileLocked& e1)
- {
- //if file is locked (try to) use Windows Volume Shadow Copy Service
- if (!shadowCopyHandler_)
- throw;
- try
- {
- //contains prefix: E.g. "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Program Files\FFS\sample.dat"
- source = shadowCopyHandler_->makeShadowCopy(source, //throw FileError
- [&](const Zstring& volumeName)
- {
- procCallback_.reportStatus(replaceCpy(_("Creating a Volume Shadow Copy for %x..."), L"%x", fmtFileName(volumeName)));
- procCallback_.forceUiRefresh();
- });
- }
- catch (const FileError& e2)
- {
- throw FileError(e1.toString(), e2.toString());
- }
-
- //now try again
- copyOperation();
- }
-#else
- copyOperation();
-#endif
-
- return newAttr;
-}
-
-
-//--------------------- data verification -------------------------
-struct VerifyCallback
-{
- virtual ~VerifyCallback() {}
- virtual void updateStatus() = 0;
-};
-
-void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback& callback) //throw FileError
-{
- static std::vector<char> memory1(1024 * 1024); //1024 kb seems to be a reasonable buffer size
- static std::vector<char> memory2(1024 * 1024);
-
-#ifdef ZEN_WIN
- wxFile file1(applyLongPathPrefix(source).c_str(), wxFile::read); //don't use buffered file input for verification!
-#elif defined ZEN_LINUX || defined ZEN_MAC
- wxFile file1(::open(source.c_str(), O_RDONLY)); //utilize UTF-8 filename
-#endif
- if (!file1.IsOpened())
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source)) + L" (open)");
-
-#ifdef ZEN_WIN
- wxFile file2(applyLongPathPrefix(target).c_str(), wxFile::read); //don't use buffered file input for verification!
-#elif defined ZEN_LINUX || defined ZEN_MAC
- wxFile file2(::open(target.c_str(), O_RDONLY)); //utilize UTF-8 filename
-#endif
- if (!file2.IsOpened()) //NO cleanup necessary for (wxFile) file1
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target)) + L" (open)");
-
- do
- {
- const size_t length1 = file1.Read(&memory1[0], memory1.size());
- if (file1.Error())
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source)));
- callback.updateStatus();
-
- const size_t length2 = file2.Read(&memory2[0], memory2.size());
- if (file2.Error())
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target)));
- callback.updateStatus();
-
- if (length1 != length2 || ::memcmp(&memory1[0], &memory2[0], length1) != 0)
- throw FileError(replaceCpy(replaceCpy(_("Data verification error: %x and %y have different content."), L"%x", L"\n" + fmtFileName(source)), L"%y", L"\n" + fmtFileName(target)));
- }
- while (!file1.Eof());
-
- if (!file2.Eof())
- throw FileError(replaceCpy(replaceCpy(_("Data verification error: %x and %y have different content."), L"%x", L"\n" + fmtFileName(source)), L"%y", L"\n" + fmtFileName(target)));
-}
-
-
-class VerifyStatusUpdater : public VerifyCallback
-{
-public:
- VerifyStatusUpdater(ProcessCallback& statusHandler) : statusHandler_(statusHandler) {}
-
- virtual void updateStatus() { statusHandler_.requestUiRefresh(); } //trigger display refresh
-
-private:
- ProcessCallback& statusHandler_;
-};
-
-
-void SynchronizeFolderPair::verifyFileCopy(const Zstring& source, const Zstring& target) const
-{
- procCallback_.reportInfo(replaceCpy(txtVerifying, L"%x", fmtFileName(target)));
-
- VerifyStatusUpdater callback(procCallback_);
- tryReportingError([&] { ::verifyFiles(source, target, callback); }, procCallback_);
-}
+} \ No newline at end of file
diff --git a/synchronization.h b/FreeFileSync/Source/synchronization.h
index bc6b79db..bc6b79db 100644
--- a/synchronization.h
+++ b/FreeFileSync/Source/synchronization.h
diff --git a/ui/app_icon.h b/FreeFileSync/Source/ui/app_icon.h
index a1240fee..a1240fee 100644
--- a/ui/app_icon.h
+++ b/FreeFileSync/Source/ui/app_icon.h
diff --git a/ui/batch_config.cpp b/FreeFileSync/Source/ui/batch_config.cpp
index 4807e4a1..4807e4a1 100644
--- a/ui/batch_config.cpp
+++ b/FreeFileSync/Source/ui/batch_config.cpp
diff --git a/ui/batch_config.h b/FreeFileSync/Source/ui/batch_config.h
index 5bff09e1..5bff09e1 100644
--- a/ui/batch_config.h
+++ b/FreeFileSync/Source/ui/batch_config.h
diff --git a/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp
index bca6b484..bd08da73 100644
--- a/ui/batch_status_handler.cpp
+++ b/FreeFileSync/Source/ui/batch_status_handler.cpp
@@ -118,7 +118,8 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress,
automaticRetryCount_(automaticRetryCount),
automaticRetryDelay_(automaticRetryDelay),
progressDlg(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, nullptr, showProgress, jobName, execWhenFinished, execFinishedHistory)),
- jobName_(jobName)
+ jobName_(jobName),
+ startTime_(wxGetUTCTimeMillis().GetValue())
{
if (logfilesCountLimit != 0)
{
@@ -131,8 +132,6 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress,
}
}
- totalTime.Start(); //measure total time
-
//if (logFile)
// ::wxSetEnv(L"logfile", utfCvrtTo<wxString>(logFile->getFilename()));
}
@@ -216,7 +215,7 @@ BatchStatusHandler::~BatchStatusHandler()
finalStatus,
getObjectsCurrent(PHASE_SYNCHRONIZING), getDataCurrent(PHASE_SYNCHRONIZING),
getObjectsTotal (PHASE_SYNCHRONIZING), getDataTotal (PHASE_SYNCHRONIZING),
- totalTime.Time() / 1000
+ (wxGetUTCTimeMillis().GetValue() - startTime_) / 1000
};
//print the results list: logfile
@@ -313,7 +312,7 @@ void BatchStatusHandler::reportWarning(const std::wstring& warningMessage, bool&
{
case xmlAccess::ON_ERROR_POPUP:
{
- if (!progressDlg) abortThisProcess();
+ if (!progressDlg) abortProcessNow();
PauseTimers dummy(*progressDlg);
forceUiRefresh();
@@ -330,18 +329,18 @@ void BatchStatusHandler::reportWarning(const std::wstring& warningMessage, bool&
case ConfirmationButton3::DONT_DO_IT: //switch
errorLog.logMsg(_("Switching to FreeFileSync's main window"), TYPE_INFO);
switchToGuiRequested = true;
- abortThisProcess();
+ abortProcessNow();
break;
case ConfirmationButton3::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
}
break; //keep it! last switch might not find match
case xmlAccess::ON_ERROR_STOP:
- abortThisProcess();
+ abortProcessNow();
break;
case xmlAccess::ON_ERROR_IGNORE:
@@ -376,7 +375,7 @@ ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& er
{
case xmlAccess::ON_ERROR_POPUP:
{
- if (!progressDlg) abortThisProcess();
+ if (!progressDlg) abortProcessNow();
PauseTimers dummy(*progressDlg);
forceUiRefresh();
@@ -397,14 +396,14 @@ ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& er
return ProcessCallback::RETRY;
case ConfirmationButton3::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
}
break; //used if last switch didn't find a match
case xmlAccess::ON_ERROR_STOP:
- abortThisProcess();
+ abortProcessNow();
break;
case xmlAccess::ON_ERROR_IGNORE:
@@ -424,7 +423,7 @@ void BatchStatusHandler::reportFatalError(const std::wstring& errorMessage)
{
case xmlAccess::ON_ERROR_POPUP:
{
- if (!progressDlg) abortThisProcess();
+ if (!progressDlg) abortProcessNow();
PauseTimers dummy(*progressDlg);
forceUiRefresh();
@@ -440,14 +439,14 @@ void BatchStatusHandler::reportFatalError(const std::wstring& errorMessage)
handleError_ = xmlAccess::ON_ERROR_IGNORE;
break;
case ConfirmationButton::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
}
break;
case xmlAccess::ON_ERROR_STOP:
- abortThisProcess();
+ abortProcessNow();
break;
case xmlAccess::ON_ERROR_IGNORE:
@@ -463,7 +462,7 @@ void BatchStatusHandler::forceUiRefresh()
}
-void BatchStatusHandler::abortThisProcess()
+void BatchStatusHandler::abortProcessNow()
{
requestAbortion(); //just make sure...
throw BatchAbortProcess(); //abort can be triggered by progressDlg
diff --git a/ui/batch_status_handler.h b/FreeFileSync/Source/ui/batch_status_handler.h
index de6e71b3..e8caa7e8 100644
--- a/ui/batch_status_handler.h
+++ b/FreeFileSync/Source/ui/batch_status_handler.h
@@ -14,7 +14,7 @@
#include "../lib/process_xml.h"
#include "progress_indicator.h"
#include "switch_to_gui.h"
-#include "lib/return_codes.h"
+#include "../lib/return_codes.h"
//Exception class used to abort the "compare" and "sync" process
@@ -49,8 +49,9 @@ public:
virtual Response reportError(const std::wstring& errorMessage, size_t retryNumber);
virtual void reportFatalError(const std::wstring& errorMessage);
+ virtual void abortProcessNow(); //throw BatchAbortProcess
+
private:
- virtual void abortThisProcess(); //throw BatchAbortProcess
void onProgressDialogTerminate();
const zen::SwitchToGui& switchBatchToGui_; //functionality to change from batch mode to GUI mode
@@ -69,7 +70,7 @@ private:
std::unique_ptr<zen::FileOutput> logFile; //optional!
const std::wstring jobName_;
- wxStopWatch totalTime;
+ const int64_t startTime_; //don't use wxStopWatch: may overflow after a few days due to ::QueryPerformanceCounter()
};
diff --git a/ui/check_version.cpp b/FreeFileSync/Source/ui/check_version.cpp
index 79fd2507..79fd2507 100644
--- a/ui/check_version.cpp
+++ b/FreeFileSync/Source/ui/check_version.cpp
diff --git a/ui/check_version.h b/FreeFileSync/Source/ui/check_version.h
index d2e7220f..d2e7220f 100644
--- a/ui/check_version.h
+++ b/FreeFileSync/Source/ui/check_version.h
diff --git a/ui/column_attr.h b/FreeFileSync/Source/ui/column_attr.h
index 070e6dd8..f930f2ef 100644
--- a/ui/column_attr.h
+++ b/FreeFileSync/Source/ui/column_attr.h
@@ -38,13 +38,13 @@ inline
std::vector<ColumnAttributeRim> getDefaultColumnAttributesLeft()
{
std::vector<ColumnAttributeRim> attr;
- attr.push_back(ColumnAttributeRim(COL_TYPE_FULL_PATH, 250, 0, false));
- attr.push_back(ColumnAttributeRim(COL_TYPE_DIRECTORY, 200, 0, false));
- attr.push_back(ColumnAttributeRim(COL_TYPE_REL_PATH, 200, 0, true));
- attr.push_back(ColumnAttributeRim(COL_TYPE_FILENAME, -280, 1, true)); //stretch to full width and substract sum of fixed size widths!
- attr.push_back(ColumnAttributeRim(COL_TYPE_DATE, 112, 0, false));
- attr.push_back(ColumnAttributeRim(COL_TYPE_SIZE, 80, 0, true));
- attr.push_back(ColumnAttributeRim(COL_TYPE_EXTENSION, 60, 0, false));
+ attr.push_back(ColumnAttributeRim(COL_TYPE_FULL_PATH, 250, 0, false));
+ attr.push_back(ColumnAttributeRim(COL_TYPE_DIRECTORY, 200, 0, false));
+ attr.push_back(ColumnAttributeRim(COL_TYPE_REL_PATH, -280, 1, true)); //stretch to full width and substract sum of fixed size widths!
+ attr.push_back(ColumnAttributeRim(COL_TYPE_FILENAME, 200, 0, true));
+ attr.push_back(ColumnAttributeRim(COL_TYPE_DATE, 112, 0, false));
+ attr.push_back(ColumnAttributeRim(COL_TYPE_SIZE, 80, 0, true));
+ attr.push_back(ColumnAttributeRim(COL_TYPE_EXTENSION, 60, 0, false));
return attr;
}
@@ -55,7 +55,7 @@ std::vector<ColumnAttributeRim> getDefaultColumnAttributesRight()
attr.push_back(ColumnAttributeRim(COL_TYPE_FULL_PATH, 250, 0, false));
attr.push_back(ColumnAttributeRim(COL_TYPE_DIRECTORY, 200, 0, false));
attr.push_back(ColumnAttributeRim(COL_TYPE_REL_PATH, 200, 0, false)); //already shown on left side
- attr.push_back(ColumnAttributeRim(COL_TYPE_FILENAME, -80, 1, true)); //stretch to full width and substract sum of fixed size widths!
+ attr.push_back(ColumnAttributeRim(COL_TYPE_FILENAME, 200, 0, true));
attr.push_back(ColumnAttributeRim(COL_TYPE_DATE, 112, 0, false));
attr.push_back(ColumnAttributeRim(COL_TYPE_SIZE, 80, 0, true));
attr.push_back(ColumnAttributeRim(COL_TYPE_EXTENSION, 60, 0, false));
diff --git a/ui/custom_grid.cpp b/FreeFileSync/Source/ui/custom_grid.cpp
index 4f498a20..8ab6e2db 100644
--- a/ui/custom_grid.cpp
+++ b/FreeFileSync/Source/ui/custom_grid.cpp
@@ -211,23 +211,19 @@ public:
void setIconManager(const std::shared_ptr<IconManager>& iconMgr) { iconMgr_ = iconMgr; }
- void updateNewAndGetMissingIcons(std::list<Zstring>& newLoad) //loads all (not yet) drawn icons
+
+ void updateNewAndGetUnbufferedIcons(std::vector<Zstring>& newLoad) //loads all not yet drawn icons
{
- //don't check too often! give worker thread some time to fetch data
if (iconMgr_)
{
const auto& rowsOnScreen = getVisibleRows(refGrid());
+ const ptrdiff_t visibleRowCount = rowsOnScreen.second - rowsOnScreen.first;
//loop over all visible rows
- const ptrdiff_t firstRow = rowsOnScreen.first;
- const ptrdiff_t rowCount = rowsOnScreen.second - firstRow;
-
- for (ptrdiff_t i = 0; i < rowCount; ++i)
+ for (ptrdiff_t i = 0; i < visibleRowCount; ++i)
{
- //alternate when adding rows: first, last, first + 1, last - 1 ... -> Icon buffer will then load reversely, i.e. from inside out
- const ptrdiff_t currentRow = firstRow + (i % 2 == 0 ?
- i / 2 :
- rowCount - 1 - (i - 1) / 2);
+ //alternate when adding rows: first, last, first + 1, last - 1 ...
+ const ptrdiff_t currentRow = rowsOnScreen.first + getAlternatingPos(i, visibleRowCount);
if (isFailedLoad(currentRow)) //find failed attempts to load icon
{
@@ -249,15 +245,34 @@ public:
}
}
+ void getUnbufferedIconsForPreload(std::vector<std::pair<ptrdiff_t, Zstring>>& newLoad) //return (priority, filename) list
+ {
+ if (iconMgr_)
+ {
+ const auto& rowsOnScreen = getVisibleRows(refGrid());
+ const ptrdiff_t visibleRowCount = rowsOnScreen.second - rowsOnScreen.first;
+
+ //preload icons not yet on screen:
+ const int preloadSize = 2 * std::max<ptrdiff_t>(20, visibleRowCount); //:= sum of lines above and below of visible range to preload
+ //=> use full visible height to handle "next page" command and a minimum of 20 for excessive mouse wheel scrolls
+
+ for (ptrdiff_t i = 0; i < preloadSize; ++i)
+ {
+ const ptrdiff_t currentRow = rowsOnScreen.first - (preloadSize + 1) / 2 + getAlternatingPos(i, visibleRowCount + preloadSize); //for odd preloadSize start one row earlier
+
+ const Zstring filename = getIconFile(currentRow);
+ if (!filename.empty() && filename != ICON_FILE_FOLDER)
+ if (!iconMgr_->refIconBuffer().readyForRetrieval(filename))
+ newLoad.push_back(std::make_pair(i, filename)); //insert least-important items on outer rim first
+ }
+ }
+ }
+
private:
bool isFailedLoad(size_t row) const { return row < failedLoads.size() ? failedLoads[row] != 0 : false; }
- void setFailedLoad(size_t row, bool failed)
+ void setFailedLoad(size_t row, bool failed = true)
{
- if (failed) //let's only pay for iconupdater when needed
- if (iconMgr_)
- iconMgr_->startIconUpdater();
-
if (failedLoads.size() != refGrid().getRowCount())
failedLoads.resize(refGrid().getRowCount());
@@ -265,6 +280,13 @@ private:
failedLoads[row] = failed;
}
+ //icon buffer will load reversely, i.e. if we want to go from inside out, we need to start from outside in
+ static size_t getAlternatingPos(size_t pos, size_t total)
+ {
+ assert(pos < total);
+ return pos % 2 == 0 ? pos / 2 : total - 1 - pos / 2;
+ }
+
protected:
virtual void renderRowBackgound(wxDC& dc, const wxRect& rect, size_t row, bool enabled, bool selected) override
{
@@ -500,6 +522,12 @@ private:
// | gap | icon | gap | text |
// --------------------------
+ //whenever there's something new to render on screen, start up watching for failed icon drawing:
+ //=> ideally it would suffice to start watching only when scrolling grid or showing new grid content, but this solution is more robust
+ //and the icon updater will stop automatically when finished anyway
+ //Note: it's not sufficient to start up on failed icon loads only, since we support prefetching of not yet visible rows!!!
+ iconMgr_->startIconUpdater();
+
const Zstring filename = getIconFile(row);
if (!filename.empty())
{
@@ -515,7 +543,7 @@ private:
else
{
fileIcon = iconMgr_->refIconBuffer().genericFileIcon(); //better than nothing
- setFailedLoad(row, true); //save status of failed icon load -> used for async. icon loading
+ setFailedLoad(row); //save status of failed icon load -> used for async. icon loading
//falsify only! we want to avoid writing incorrect success values when only partially updating the DC, e.g. when scrolling,
//see repaint behavior of ::ScrollWindow() function!
}
@@ -778,7 +806,7 @@ public:
{
if (row < refGrid().getRowCount())
{
- refGrid().clearSelection(false); //don't emit event, prevent recursion!
+ refGrid().clearSelection(DENY_GRID_EVENT); //don't emit event, prevent recursion!
dragSelection = make_unique<std::pair<size_t, BlockPosition>>(row, mousePosToBlock(clientPos, row, static_cast<ColumnTypeMiddle>(colType)));
toolTip.hide(); //handle custom tooltip
}
@@ -786,7 +814,7 @@ public:
void onSelectEnd(size_t rowFirst, size_t rowLast) //we cannot reuse row from "onSelectBegin": if user is holding shift, this may now be in the middle of the range!
{
- refGrid().clearSelection(false); //don't emit event, prevent recursion!
+ refGrid().clearSelection(DENY_GRID_EVENT); //don't emit event, prevent recursion!
//issue custom event
if (dragSelection)
@@ -847,19 +875,19 @@ public:
const wxPoint& topLeftAbs = refGrid().CalcUnscrolledPosition(clientPos);
const size_t row = refGrid().getRowAtPos(topLeftAbs.y); //return -1 for invalid position, rowCount if one past the end
- auto colInfo = refGrid().getColumnAtPos(topLeftAbs.x); //(column type, component position)
+ const Opt<ColumnType> ct = refGrid().getColumnAtPos(topLeftAbs.x);
- if (row < refGrid().getRowCount() && colInfo)
+ if (row < refGrid().getRowCount() && ct)
{
if (highlight) refreshHighlight(highlight->row_); //refresh old highlight
- highlight = make_unique<MouseHighlight>(row, mousePosToBlock(clientPos, row, static_cast<ColumnTypeMiddle>(colInfo->first)));
+ highlight = make_unique<MouseHighlight>(row, mousePosToBlock(clientPos, row, static_cast<ColumnTypeMiddle>(*ct)));
refreshHighlight(highlight->row_);
//show custom tooltip
if (refGrid().getMainWin().GetClientRect().Contains(clientPos)) //cursor might have moved outside visible client area
- showToolTip(row, static_cast<ColumnTypeMiddle>(colInfo->first), refGrid().getMainWin().ClientToScreen(clientPos));
+ showToolTip(row, static_cast<ColumnTypeMiddle>(*ct), refGrid().getMainWin().ClientToScreen(clientPos));
}
else
onMouseLeave();
@@ -1344,7 +1372,8 @@ private:
void onCenterSelectEnd(GridRangeSelectEvent& event)
{
- provMiddle_.onSelectEnd(event.rowFirst_, event.rowLast_);
+ if (event.positive_)
+ provMiddle_.onSelectEnd(event.rowFirst_, event.rowLast_);
event.Skip();
}
@@ -1366,7 +1395,7 @@ private:
void onGridSelection(const Grid& grid, Grid& other)
{
if (!wxGetKeyState(WXK_CONTROL)) //clear other grid unless user is holding CTRL
- other.clearSelection(false); //don't emit event, prevent recursion!
+ other.clearSelection(DENY_GRID_EVENT); //don't emit event, prevent recursion!
}
void onKeyDownL(wxKeyEvent& event) { onKeyDown(event, gridL_); }
@@ -1389,8 +1418,7 @@ private:
}
//skip middle component when navigating via keyboard
-
- const auto row = grid.getGridCursor().first;
+ const size_t row = grid.getGridCursor();
if (event.ShiftDown())
;
@@ -1620,7 +1648,7 @@ std::vector<ColumnAttributeRim> gridview::convertConfig(const std::vector<Grid::
namespace
{
-class IconUpdater : private wxEvtHandler //update file icons periodically: use SINGLE instance to coordinate left and right grid in parallel
+class IconUpdater : private wxEvtHandler //update file icons periodically: use SINGLE instance to coordinate left and right grids in parallel
{
public:
IconUpdater(GridDataLeft& provLeft, GridDataRight& provRight, IconBuffer& iconBuffer) : provLeft_(provLeft), provRight_(provRight), iconBuffer_(iconBuffer)
@@ -1628,16 +1656,30 @@ public:
timer.Connect(wxEVT_TIMER, wxEventHandler(IconUpdater::loadIconsAsynchronously), nullptr, this);
}
- void start() { if (!timer.IsRunning()) timer.Start(50); } //timer interval in [ms]
+ void start() { if (!timer.IsRunning()) timer.Start(100); } //timer interval in [ms]
+ //don't check too often! give worker thread some time to fetch data
private:
- void stop() { if ( timer.IsRunning()) timer.Stop(); }
+ void stop() { if (timer.IsRunning()) timer.Stop(); }
void loadIconsAsynchronously(wxEvent& event) //loads all (not yet) drawn icons
{
- std::list<Zstring> newLoad;
- provLeft_ .updateNewAndGetMissingIcons(newLoad);
- provRight_.updateNewAndGetMissingIcons(newLoad);
+ std::vector<std::pair<ptrdiff_t, Zstring>> prefetchLoad;
+ provLeft_ .getUnbufferedIconsForPreload(prefetchLoad);
+ provRight_.getUnbufferedIconsForPreload(prefetchLoad);
+
+ //make sure least-important prefetch rows are inserted first into workload (=> processed last)
+ typedef std::pair<ptrdiff_t, Zstring> Pft; //priority index nicely considers both grids at the same time!
+ std::sort(prefetchLoad.begin(), prefetchLoad.end(), [](const Pft& lhs, const Pft& rhs) { return lhs.first < rhs.first; });
+
+ //last inserted items are processed first in icon buffer:
+ std::vector<Zstring> newLoad;
+ for (const auto& item : prefetchLoad)
+ newLoad.push_back(item.second);
+
+ provRight_.updateNewAndGetUnbufferedIcons(newLoad);
+ provLeft_ .updateNewAndGetUnbufferedIcons(newLoad);
+
iconBuffer_.setWorkload(newLoad);
if (newLoad.empty()) //let's only pay for iconupdater when needed
@@ -1690,13 +1732,6 @@ void gridview::setupIcons(Grid& gridLeft, Grid& gridCenter, Grid& gridRight, boo
}
-void gridview::clearSelection(Grid& gridLeft, Grid& gridCenter, Grid& gridRight)
-{
- gridLeft .clearSelection();
- gridCenter.clearSelection();
- gridRight .clearSelection();
-}
-
void gridview::refresh(Grid& gridLeft, Grid& gridCenter, Grid& gridRight)
{
gridLeft .Refresh();
diff --git a/ui/custom_grid.h b/FreeFileSync/Source/ui/custom_grid.h
index 32beee01..9d7c8856 100644
--- a/ui/custom_grid.h
+++ b/FreeFileSync/Source/ui/custom_grid.h
@@ -26,7 +26,6 @@ void highlightSyncAction(Grid& gridCenter, bool value);
void setupIcons(Grid& gridLeft, Grid& gridCenter, Grid& gridRight, bool show, IconBuffer::IconSize sz);
-void clearSelection(Grid& gridLeft, Grid& gridCenter, Grid& gridRight); //clear all components
void refresh(Grid& gridLeft, Grid& gridCenter, Grid& gridRight);
void setScrollMaster(Grid& grid);
diff --git a/ui/dir_name.cpp b/FreeFileSync/Source/ui/dir_name.cpp
index 022773e4..ee0ee64a 100644
--- a/ui/dir_name.cpp
+++ b/FreeFileSync/Source/ui/dir_name.cpp
@@ -21,7 +21,7 @@
#ifdef ZEN_WIN
#include <zen/dll.h>
#include <zen/win_ver.h>
-#include "IFileDialog_Vista\ifile_dialog.h"
+#include "../dll/IFileDialog_Vista\ifile_dialog.h"
#endif
using namespace zen;
diff --git a/ui/dir_name.h b/FreeFileSync/Source/ui/dir_name.h
index 21f2b574..21f2b574 100644
--- a/ui/dir_name.h
+++ b/FreeFileSync/Source/ui/dir_name.h
diff --git a/ui/exec_finished_box.cpp b/FreeFileSync/Source/ui/exec_finished_box.cpp
index cbbfa17d..cbbfa17d 100644
--- a/ui/exec_finished_box.cpp
+++ b/FreeFileSync/Source/ui/exec_finished_box.cpp
diff --git a/ui/exec_finished_box.h b/FreeFileSync/Source/ui/exec_finished_box.h
index 2a69faef..2a69faef 100644
--- a/ui/exec_finished_box.h
+++ b/FreeFileSync/Source/ui/exec_finished_box.h
diff --git a/ui/folder_history_box.cpp b/FreeFileSync/Source/ui/folder_history_box.cpp
index 4676aa43..4676aa43 100644
--- a/ui/folder_history_box.cpp
+++ b/FreeFileSync/Source/ui/folder_history_box.cpp
diff --git a/ui/folder_history_box.h b/FreeFileSync/Source/ui/folder_history_box.h
index 9ffa2d74..9ffa2d74 100644
--- a/ui/folder_history_box.h
+++ b/FreeFileSync/Source/ui/folder_history_box.h
diff --git a/ui/folder_history_types.h b/FreeFileSync/Source/ui/folder_history_types.h
index 23766413..23766413 100644
--- a/ui/folder_history_types.h
+++ b/FreeFileSync/Source/ui/folder_history_types.h
diff --git a/ui/folder_pair.h b/FreeFileSync/Source/ui/folder_pair.h
index be01e79d..be01e79d 100644
--- a/ui/folder_pair.h
+++ b/FreeFileSync/Source/ui/folder_pair.h
diff --git a/ui/grid_view.cpp b/FreeFileSync/Source/ui/grid_view.cpp
index e1e16e47..e1e16e47 100644
--- a/ui/grid_view.cpp
+++ b/FreeFileSync/Source/ui/grid_view.cpp
diff --git a/ui/grid_view.h b/FreeFileSync/Source/ui/grid_view.h
index 0cef5dea..c01ac240 100644
--- a/ui/grid_view.h
+++ b/FreeFileSync/Source/ui/grid_view.h
@@ -97,7 +97,7 @@ public:
bool conflictFilesActive);
void setData(FolderComparison& newData);
- void removeInvalidRows(); //remove rows that have been deleted meanwhile: call after manual deletion and synchronization!
+ void removeInvalidRows(); //remove references to rows that have been deleted meanwhile: call after manual deletion and synchronization!
//sorting...
bool static getDefaultSortDirection(zen::ColumnTypeRim type); //true: ascending; false: descending
diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp
new file mode 100644
index 00000000..91783b83
--- /dev/null
+++ b/FreeFileSync/Source/ui/gui_generated.cpp
@@ -0,0 +1,3499 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version Oct 8 2012)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "../wx+/bitmap_button.h"
+#include "../wx+/graph.h"
+#include "../wx+/grid.h"
+#include "../wx+/toggle_button.h"
+#include "exec_finished_box.h"
+#include "folder_history_box.h"
+#include "triple_splitter.h"
+
+#include "gui_generated.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( 640,400 ), wxDefaultSize );
+
+ m_menubar1 = new wxMenuBar( 0 );
+ m_menuFile = new wxMenu();
+ m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemNew );
+
+ m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemLoad );
+
+ m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemSave );
+
+ m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemSaveAs );
+
+ m_menuItem7 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItem7 );
+
+ m_menuFile->AppendSeparator();
+
+ m_menuItem10 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItem10 );
+
+ m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItem11 );
+
+ m_menuFile->AppendSeparator();
+
+ wxMenuItem* m_menuItem4;
+ m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItem4 );
+
+ m_menubar1->Append( m_menuFile, _("&Program") );
+
+ m_menuTools = new wxMenu();
+ m_menuItemGlobSett = new wxMenuItem( m_menuTools, wxID_PREFERENCES, wxString( _("&Global settings") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItemGlobSett );
+
+ m_menuTools->AppendSeparator();
+
+ m_menuLanguages = new wxMenu();
+ m_menuTools->Append( -1, _("&Language"), m_menuLanguages );
+
+ wxMenuItem* m_menuItem15;
+ m_menuItem15 = new wxMenuItem( m_menuTools, wxID_FIND, wxString( _("&Find...") ) + wxT('\t') + wxT("Ctrl+F"), wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItem15 );
+
+ wxMenuItem* m_menuItem5;
+ m_menuItem5 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItem5 );
+
+ m_menubar1->Append( m_menuTools, _("&Tools") );
+
+ m_menuHelp = new wxMenu();
+ m_menuItemManual = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&View help") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL );
+ m_menuHelp->Append( m_menuItemManual );
+
+ m_menuCheckVersion = new wxMenu();
+ m_menuItemCheckVersionNow = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("&Check now") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuCheckVersion->Append( m_menuItemCheckVersionNow );
+
+ m_menuItemCheckVersionAuto = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("Check &automatically once a week") ) , wxEmptyString, wxITEM_CHECK );
+ m_menuCheckVersion->Append( m_menuItemCheckVersionAuto );
+ m_menuItemCheckVersionAuto->Check( true );
+
+ m_menuHelp->Append( -1, _("&Check for new version"), m_menuCheckVersion );
+
+ m_menuHelp->AppendSeparator();
+
+ m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL );
+ m_menuHelp->Append( m_menuItemAbout );
+
+ m_menubar1->Append( m_menuHelp, _("&Help") );
+
+ this->SetMenuBar( m_menubar1 );
+
+ bSizerPanelHolder = new wxBoxSizer( wxVERTICAL );
+
+ m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL );
+ bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer1721;
+ bSizer1721 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonCompare->SetDefault();
+ m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_buttonCompare->SetToolTip( _("dummy") );
+
+ bSizer1721->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_buttonCancel = new zen::BitmapTextButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( 180,-1 ), 0 );
+ m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_buttonCancel->Enable( false );
+ m_buttonCancel->Hide();
+
+ bSizer1721->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 44,44 ), wxBU_AUTODRAW );
+ m_bpButtonCmpConfig->SetToolTip( _("dummy") );
+
+ bSizer1721->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxEXPAND, 3 );
+
+
+ bSizer1721->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 44,44 ), wxBU_AUTODRAW );
+ m_bpButtonSyncConfig->SetToolTip( _("dummy") );
+
+ bSizer1721->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 3 );
+
+ m_buttonSync = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_buttonSync->SetToolTip( _("dummy") );
+
+ bSizer1721->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerTopButtons->Add( bSizer1721, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 4 );
+
+
+ bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panelTopButtons->SetSizer( bSizerTopButtons );
+ m_panelTopButtons->Layout();
+ bSizerTopButtons->Fit( m_panelTopButtons );
+ bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1601;
+ bSizer1601 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer91;
+ bSizer91 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelTopLeft->SetMinSize( wxSize( 1,-1 ) );
+
+ wxFlexGridSizer* fgSizer8;
+ fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer8->AddGrowableCol( 1 );
+ fgSizer8->SetFlexibleDirection( wxBOTH );
+ fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL );
+
+
+ fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextResolvedPathL->Wrap( -1 );
+ fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+ wxBoxSizer* bSizer159;
+ bSizer159 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonAddPair->SetToolTip( _("Add folder pair") );
+
+ bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
+
+ bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
+
+ bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ fgSizer8->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelTopLeft->SetSizer( fgSizer8 );
+ m_panelTopLeft->Layout();
+ fgSizer8->Fit( m_panelTopLeft );
+ bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1771;
+ bSizer1771 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSwapSides->SetToolTip( _("Swap sides") );
+
+ bSizer1771->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
+
+ m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panelTopMiddle->SetSizer( bSizer1771 );
+ m_panelTopMiddle->Layout();
+ bSizer1771->Fit( m_panelTopMiddle );
+ bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelTopRight->SetMinSize( wxSize( 1,-1 ) );
+
+ wxBoxSizer* bSizer183;
+ bSizer183 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextResolvedPathR->Wrap( -1 );
+ bSizer183->Add( m_staticTextResolvedPathR, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+ wxBoxSizer* bSizer179;
+ bSizer179 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
+
+ bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelTopRight->SetSizer( bSizer183 );
+ m_panelTopRight->Layout();
+ bSizer183->Fit( m_panelTopRight );
+ bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 );
+
+ m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL );
+ m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 );
+ m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) );
+
+ bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL );
+
+
+ m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs );
+ m_scrolledWindowFolderPairs->Layout();
+ bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs );
+ bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelDirectoryPairs->SetSizer( bSizer1601 );
+ m_panelDirectoryPairs->Layout();
+ bSizer1601->Fit( m_panelDirectoryPairs );
+ bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_gridNavi = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridNavi->SetScrollRate( 5, 5 );
+ bSizerPanelHolder->Add( m_gridNavi, 1, wxEXPAND, 5 );
+
+ m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1711;
+ bSizer1711 = new wxBoxSizer( wxVERTICAL );
+
+ m_splitterMain = new zen::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1781;
+ bSizer1781 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMainL->SetScrollRate( 5, 5 );
+ bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 );
+
+ m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMainC->SetScrollRate( 5, 5 );
+ bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 );
+
+ m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMainR->SetScrollRate( 5, 5 );
+ bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 );
+
+
+ m_splitterMain->SetSizer( bSizer1781 );
+ m_splitterMain->Layout();
+ bSizer1781->Fit( m_splitterMain );
+ bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 );
+
+ m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer451;
+ bSizer451 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizer451->SetMinSize( wxSize( -1,22 ) );
+ bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer53;
+ bSizer53 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftDirs->Wrap( -1 );
+ bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftFiles->Wrap( -1 );
+ bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftFiles->Add( 4, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftBytes->Wrap( -1 );
+ bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizerStatusLeft->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 2 );
+
+
+ bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusMiddle->Wrap( -1 );
+ bSizerFileStatus->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 );
+
+ wxBoxSizer* bSizer52;
+ bSizer52 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightDirs->Wrap( -1 );
+ bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightFiles->Wrap( -1 );
+ bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightFiles->Add( 4, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightBytes->Wrap( -1 );
+ bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRight->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer451->Add( bSizerFileStatus, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextFullStatus->Wrap( -1 );
+ m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ m_panelStatusBar->SetSizer( bSizer451 );
+ m_panelStatusBar->Layout();
+ bSizer451->Fit( m_panelStatusBar );
+ bSizer1711->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+
+ m_panelCenter->SetSizer( bSizer1711 );
+ m_panelCenter->Layout();
+ bSizer1711->Fit( m_panelCenter );
+ bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 );
+
+ m_panelSearch = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1713;
+ bSizer1713 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonHideSearch->SetToolTip( _("Close search bar") );
+
+ bSizer1713->Add( m_bpButtonHideSearch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_staticText101 = new wxStaticText( m_panelSearch, wxID_ANY, _("Find:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText101->Wrap( -1 );
+ bSizer1713->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0|wxWANTS_CHARS );
+ m_textCtrlSearchTxt->SetMaxLength( 0 );
+ bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer1713->Add( m_checkBoxMatchCase, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ m_panelSearch->SetSizer( bSizer1713 );
+ m_panelSearch->Layout();
+ bSizer1713->Fit( m_panelSearch );
+ bSizerPanelHolder->Add( m_panelSearch, 0, 0, 5 );
+
+ m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizerConfig = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer151;
+ bSizer151 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonOpen->SetToolTip( _("dummy") );
+
+ bSizer151->Add( m_bpButtonOpen, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonSave->SetToolTip( _("dummy") );
+
+ bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonBatchJob = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonBatchJob->SetToolTip( _("Save as batch job") );
+
+ bSizer151->Add( m_bpButtonBatchJob, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB );
+ m_listBoxHistory->SetMinSize( wxSize( -1,40 ) );
+
+ bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panelConfig->SetSizer( bSizerConfig );
+ m_panelConfig->Layout();
+ bSizerConfig->Fit( m_panelConfig );
+ bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 );
+
+ m_panelFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer171;
+ bSizer171 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
+ bSizer171->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_checkBoxHideExcluded = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxHideExcluded->SetToolTip( _("Show filtered or temporarily excluded files") );
+
+ bSizer171->Add( m_checkBoxHideExcluded, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ m_panelFilter->SetSizer( bSizer171 );
+ m_panelFilter->Layout();
+ bSizer171->Fit( m_panelFilter );
+ bSizerPanelHolder->Add( m_panelFilter, 0, 0, 5 );
+
+ m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizer1801 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizerStatistics = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer1712;
+ bSizer1712 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer1712->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateLeft->Wrap( -1 );
+ m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer1712, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
+
+ bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer172->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateLeft->Wrap( -1 );
+ m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
+
+ bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer173->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteLeft->Wrap( -1 );
+ m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ bSizerData = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapData->SetToolTip( _("Total bytes to copy") );
+
+ bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerData->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizerData->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextData->Wrap( -1 );
+ m_staticTextData->SetToolTip( _("Total bytes to copy") );
+
+ bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizerData, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer176;
+ bSizer176 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer176->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer176->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteRight->Wrap( -1 );
+ m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer177;
+ bSizer177 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
+
+ bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer177->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer177->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateRight->Wrap( -1 );
+ m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
+
+ bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer178->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer178->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateRight->Wrap( -1 );
+ m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer1801->Add( bSizerStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panelStatistics->SetSizer( bSizer1801 );
+ m_panelStatistics->Layout();
+ bSizer1801->Fit( m_panelStatistics );
+ bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonViewTypeSyncAction = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bpButtonShowCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowUpdateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowUpdateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panelViewFilter->SetSizer( bSizerViewFilter );
+ m_panelViewFilter->Layout();
+ bSizerViewFilter->Fit( m_panelViewFilter );
+ bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ this->SetSizer( bSizerPanelHolder );
+ this->Layout();
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
+ this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) );
+ this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) );
+ this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) );
+ this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) );
+ this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) );
+ this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
+ this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
+ this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
+ this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) );
+ this->Connect( m_menuItem15->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuFindItem ) );
+ this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) );
+ this->Connect( m_menuItemManual->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) );
+ this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) );
+ this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) );
+ this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) );
+ m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this );
+ m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this );
+ m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
+ m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this );
+ m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
+ m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this );
+ m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this );
+ m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this );
+ m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this );
+ m_bpButtonHideSearch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideSearchPanel ), NULL, this );
+ m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MainDialogGenerated::OnSearchGridEnter ), NULL, this );
+ m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this );
+ m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this );
+ m_bpButtonBatchJob->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this );
+ m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
+ m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
+ m_checkBoxHideExcluded->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this );
+ m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this );
+ m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+}
+
+MainDialogGenerated::~MainDialogGenerated()
+{
+}
+
+CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer136;
+ bSizer136 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel36 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel36->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer159;
+ bSizer159 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText91 = new wxStaticText( m_panel36, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText91->Wrap( -1 );
+ bSizer182->Add( m_staticText91, 0, wxALL, 5 );
+
+ wxFlexGridSizer* fgSizer16;
+ fgSizer16 = new wxFlexGridSizer( 2, 2, 5, 5 );
+ fgSizer16->SetFlexibleDirection( wxBOTH );
+ fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_bitmapByTime = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapByTime->SetToolTip( _("Identify equal files by comparing modification time and size.") );
+
+ fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_toggleBtnTimeSize = new wxToggleButton( m_panel36, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_toggleBtnTimeSize->SetValue( true );
+ m_toggleBtnTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_toggleBtnTimeSize->SetToolTip( _("Identify equal files by comparing modification time and size.") );
+
+ fgSizer16->Add( m_toggleBtnTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_bitmapByContent = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapByContent->SetToolTip( _("Identify equal files by comparing the file content.") );
+
+ fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_toggleBtnContent = new wxToggleButton( m_panel36, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_toggleBtnContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_toggleBtnContent->SetToolTip( _("Identify equal files by comparing the file content.") );
+
+ fgSizer16->Add( m_toggleBtnContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer182->Add( fgSizer16, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer159->Add( bSizer182, 0, wxALL, 5 );
+
+ m_staticline33 = new wxStaticLine( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText92 = new wxStaticText( m_panel36, wxID_ANY, _("Symbolic links:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText92->Wrap( -1 );
+ bSizer172->Add( m_staticText92, 0, wxBOTTOM, 5 );
+
+ wxArrayString m_choiceHandleSymlinksChoices;
+ m_choiceHandleSymlinks = new wxChoice( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 );
+ m_choiceHandleSymlinks->SetSelection( -1 );
+ bSizer172->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_hyperlink24 = new wxHyperlinkCtrl( m_panel36, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer172->Add( m_hyperlink24, 0, wxTOP, 5 );
+
+
+ bSizer159->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 );
+
+
+ m_panel36->SetSizer( bSizer159 );
+ m_panel36->Layout();
+ bSizer159->Fit( m_panel36 );
+ bSizer136->Add( m_panel36, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer136->Add( m_staticline14, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOkay->SetDefault();
+ m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer136->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer136 );
+ this->Layout();
+ bSizer136->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) );
+ m_toggleBtnTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this );
+ m_toggleBtnTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this );
+ m_toggleBtnContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this );
+ m_toggleBtnContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this );
+ m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this );
+ m_hyperlink24->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( CmpCfgDlgGenerated::OnHelpComparisonSettings ), NULL, this );
+ m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this );
+}
+
+CmpCfgDlgGenerated::~CmpCfgDlgGenerated()
+{
+}
+
+SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer7;
+ bSizer7 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel37 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel37->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer29;
+ bSizer29 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer183;
+ bSizer183 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText86 = new wxStaticText( m_panel37, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText86->Wrap( -1 );
+ bSizer183->Add( m_staticText86, 0, wxALL, 5 );
+
+ wxFlexGridSizer* fgSizer1;
+ fgSizer1 = new wxFlexGridSizer( 4, 2, 5, 5 );
+ fgSizer1->SetFlexibleDirection( wxBOTH );
+ fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ wxBoxSizer* bSizer171;
+ bSizer171 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer171->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_toggleBtnTwoWay = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnTwoWay->SetValue( true );
+ m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer171->Add( m_toggleBtnTwoWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer171->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ fgSizer1->Add( bSizer171, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_staticTextAutomatic = new wxStaticText( m_panel37, wxID_ANY, _("Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextAutomatic->Wrap( 480 );
+ fgSizer1->Add( m_staticTextAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_toggleBtnMirror = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer172->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ fgSizer1->Add( bSizer172, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextMirror = new wxStaticText( m_panel37, wxID_ANY, _("Create a mirror backup of the left folder which exactly matches the right folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMirror->Wrap( 480 );
+ fgSizer1->Add( m_staticTextMirror, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_toggleBtnUpdate = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer173->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ fgSizer1->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_staticTextUpdate = new wxStaticText( m_panel37, wxID_ANY, _("Copy new and updated files to the right folder."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdate->Wrap( 480 );
+ fgSizer1->Add( m_staticTextUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer1741;
+ bSizer1741 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer1741->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_toggleBtnCustom = new wxToggleButton( m_panel37, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer1741->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer1741->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ fgSizer1->Add( bSizer1741, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextCustom = new wxStaticText( m_panel37, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCustom->Wrap( 480 );
+ fgSizer1->Add( m_staticTextCustom, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer183->Add( fgSizer1, 0, wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer1751;
+ bSizer1751 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer1751->Add( 8, 0, 0, 0, 5 );
+
+ m_checkBoxDetectMove = new wxCheckBox( m_panel37, wxID_ANY, _("Detect moved files"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxDetectMove->SetValue(true);
+ m_checkBoxDetectMove->SetToolTip( _("Requires database files. Not supported by all file systems.") );
+
+ bSizer1751->Add( m_checkBoxDetectMove, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+
+
+ bSizer183->Add( bSizer1751, 0, wxEXPAND, 5 );
+
+
+ bSizer29->Add( bSizer183, 0, wxALL, 5 );
+
+ m_staticline32 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer29->Add( m_staticline32, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer184;
+ bSizer184 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText87 = new wxStaticText( m_panel37, wxID_ANY, _("Delete files:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText87->Wrap( -1 );
+ bSizer184->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_toggleBtnPermanent = new wxToggleButton( m_panel37, wxID_ANY, _("Permanent"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") );
+
+ bSizer180->Add( m_toggleBtnPermanent, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_toggleBtnRecycler = new wxToggleButton( m_panel37, wxID_ANY, _("Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnRecycler->SetToolTip( _("Back up deleted and overwritten files in the recycle bin") );
+
+ bSizer180->Add( m_toggleBtnRecycler, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_toggleBtnVersioning = new wxToggleButton( m_panel37, wxID_ANY, _("Versioning"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnVersioning->SetToolTip( _("Move files to a user-defined folder") );
+
+ bSizer180->Add( m_toggleBtnVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer184->Add( bSizer180, 0, wxTOP, 5 );
+
+ m_panelVersioning = new wxPanel( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer191;
+ bSizer191 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer156;
+ bSizer156 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_versioningFolder = new FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer156->Add( m_versioningFolder, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirVersioning = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirVersioning->SetToolTip( _("Select a folder") );
+
+ bSizer156->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer191->Add( bSizer156, 1, wxEXPAND|wxBOTTOM, 5 );
+
+ bSizer192 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText93 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText93->Wrap( -1 );
+ bSizer192->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ wxArrayString m_choiceVersioningStyleChoices;
+ m_choiceVersioningStyle = new wxChoice( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVersioningStyleChoices, 0 );
+ m_choiceVersioningStyle->SetSelection( 0 );
+ bSizer192->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_staticTextNamingCvtPart1 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextNamingCvtPart1->Wrap( -1 );
+ m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer192->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextNamingCvtPart2Bold = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextNamingCvtPart2Bold->Wrap( -1 );
+ m_staticTextNamingCvtPart2Bold->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer192->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextNamingCvtPart3 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextNamingCvtPart3->Wrap( -1 );
+ m_staticTextNamingCvtPart3->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer192->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer192->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer192->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+
+ bSizer191->Add( bSizer192, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelVersioning->SetSizer( bSizer191 );
+ m_panelVersioning->Layout();
+ bSizer191->Fit( m_panelVersioning );
+ bSizer184->Add( m_panelVersioning, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 );
+
+
+ bSizer29->Add( bSizer184, 0, wxALL|wxEXPAND, 10 );
+
+ bSizerExtraConfig = new wxBoxSizer( wxVERTICAL );
+
+ m_staticline321 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerExtraConfig->Add( m_staticline321, 0, wxEXPAND, 5 );
+
+ bSizer179 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText88 = new wxStaticText( m_panel37, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText88->Wrap( -1 );
+ bSizer174->Add( m_staticText88, 0, wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer175;
+ bSizer175 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_toggleBtnErrorIgnore = new wxToggleButton( m_panel37, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") );
+
+ bSizer175->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_toggleBtnErrorPopup = new wxToggleButton( m_panel37, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") );
+
+ bSizer175->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer174->Add( bSizer175, 0, 0, 5 );
+
+
+ bSizer179->Add( bSizer174, 0, wxALL, 10 );
+
+ m_staticline36 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer179->Add( m_staticline36, 0, wxEXPAND, 5 );
+
+ bSizerOnCompletion = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText89 = new wxStaticText( m_panel37, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText89->Wrap( -1 );
+ bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 );
+
+ m_comboBoxExecFinished = new ExecFinishedBox( m_panel37, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizerOnCompletion->Add( m_comboBoxExecFinished, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer179->Add( bSizerOnCompletion, 1, wxALL, 10 );
+
+
+ bSizerExtraConfig->Add( bSizer179, 0, wxEXPAND, 5 );
+
+
+ bSizer29->Add( bSizerExtraConfig, 0, wxEXPAND, 5 );
+
+
+ bSizer181->Add( bSizer29, 0, wxEXPAND, 5 );
+
+ m_staticline31 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer181->Add( m_staticline31, 0, wxEXPAND, 5 );
+
+ bSizerConfig = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer18011;
+ bSizer18011 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextHeaderCategory1 = new wxStaticText( m_panel37, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );
+ m_staticTextHeaderCategory1->Wrap( -1 );
+ bSizer18011->Add( m_staticTextHeaderCategory1, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer18011->Add( 5, 0, 0, 0, 5 );
+
+ m_staticTextHeaderAction1 = new wxStaticText( m_panel37, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT );
+ m_staticTextHeaderAction1->Wrap( -1 );
+ bSizer18011->Add( m_staticTextHeaderAction1, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerConfig->Add( bSizer18011, 0, wxEXPAND, 5 );
+
+
+ bSizerConfig->Add( 0, 5, 0, 0, 5 );
+
+ m_bitmapDatabase = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerConfig->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 );
+
+ wxBoxSizer* sbSizerKeepWidthStableIfSyncDirsNotShown;
+ sbSizerKeepWidthStableIfSyncDirsNotShown = new wxBoxSizer( wxHORIZONTAL );
+
+
+ sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 45, 0, 0, 0, 5 );
+
+
+ sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 5, 0, 0, 0, 5 );
+
+
+ sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 46, 0, 0, 0, 5 );
+
+
+ bSizerConfig->Add( sbSizerKeepWidthStableIfSyncDirsNotShown, 0, 0, 5 );
+
+ sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL );
+
+ bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapLeftOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") );
+
+ bSizerLeftOnly->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerLeftOnly->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonLeftOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizerSyncDirections->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapRightOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") );
+
+ bSizerRightOnly->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerRightOnly->Add( 5, 0, 0, 0, 5 );
+
+ m_bpButtonRightOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizerSyncDirections->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapLeftNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapLeftNewer->SetToolTip( _("Left side is newer") );
+
+ bSizerLeftNewer->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerLeftNewer->Add( 5, 0, 0, 0, 5 );
+
+ m_bpButtonLeftNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizerSyncDirections->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapRightNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapRightNewer->SetToolTip( _("Right side is newer") );
+
+ bSizerRightNewer->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerRightNewer->Add( 5, 0, 0, 0, 5 );
+
+ m_bpButtonRightNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizerSyncDirections->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizerDifferent = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapDifferent = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapDifferent->SetToolTip( _("Items have different content") );
+
+ bSizerDifferent->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerDifferent->Add( 5, 0, 0, 0, 5 );
+
+ m_bpButtonDifferent = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizerSyncDirections->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizerConflict = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapConflict = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") );
+
+ bSizerConflict->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerConflict->Add( 5, 0, 0, 0, 5 );
+
+ m_bpButtonConflict = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizerSyncDirections->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerConfig->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 );
+
+
+ bSizer181->Add( bSizerConfig, 0, wxALL|wxEXPAND, 10 );
+
+
+ m_panel37->SetSizer( bSizer181 );
+ m_panel37->Layout();
+ bSizer181->Fit( m_panel37 );
+ bSizer7->Add( m_panel37, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline15 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer7->Add( m_staticline15, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOK->SetDefault();
+ m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer7->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer7 );
+ this->Layout();
+ bSizer7->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) );
+ m_toggleBtnTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncTwoWayDouble ), NULL, this );
+ m_toggleBtnTwoWay->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncTwoWay ), NULL, this );
+ m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this );
+ m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
+ m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this );
+ m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
+ m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this );
+ m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
+ m_checkBoxDetectMove->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnToggleDetectMovedFiles ), NULL, this );
+ m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this );
+ m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this );
+ m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this );
+ m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnParameterChange ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( SyncCfgDlgGenerated::OnHelpVersioning ), NULL, this );
+ m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this );
+ m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this );
+ m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this );
+ m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this );
+ m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this );
+ m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this );
+ m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this );
+ m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this );
+ m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this );
+}
+
+SyncCfgDlgGenerated::~SyncCfgDlgGenerated()
+{
+}
+
+SyncConfirmationDlgGenerated::SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSync = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer72->Add( m_bitmapSync, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Start synchronization now?"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHeader->Wrap( -1 );
+ bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer134->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 );
+
+ m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer185->Add( 0, 0, 1, 0, 5 );
+
+ m_staticline38 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer185->Add( m_staticline38, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText84 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Variant:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText84->Wrap( -1 );
+ bSizer182->Add( m_staticText84, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+
+ bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextVariant = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextVariant->Wrap( -1 );
+ m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer182->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ bSizer162->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
+
+ m_staticline14 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer162->Add( m_staticline14, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText83->Wrap( -1 );
+ bSizer181->Add( m_staticText83, 0, wxALL, 5 );
+
+ wxFlexGridSizer* fgSizer11;
+ fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 );
+ fgSizer11->SetFlexibleDirection( wxBOTH );
+ fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
+
+ fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapData->SetToolTip( _("Total bytes to copy") );
+
+ fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
+
+ fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateLeft->Wrap( -1 );
+ m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateLeft->Wrap( -1 );
+ m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
+
+ fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteLeft->Wrap( -1 );
+ m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextData->Wrap( -1 );
+ m_staticTextData->SetToolTip( _("Total bytes to copy") );
+
+ fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteRight->Wrap( -1 );
+ m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateRight->Wrap( -1 );
+ m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
+
+ fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateRight->Wrap( -1 );
+ m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer181->Add( fgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 5 );
+
+
+ bSizer185->Add( bSizer162, 0, 0, 5 );
+
+
+ m_panelStatistics->SetSizer( bSizer185 );
+ m_panelStatistics->Layout();
+ bSizer185->Fit( m_panelStatistics );
+ bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 );
+
+ m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer164;
+ bSizer164 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer164->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonStartSync = new wxButton( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonStartSync->SetDefault();
+ m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ bSizer134->Add( bSizer164, 1, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer134 );
+ this->Layout();
+ bSizer134->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::OnClose ) );
+ m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnStartSync ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnCancel ), NULL, this );
+}
+
+SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated()
+{
+}
+
+FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+ wxBoxSizer* bSizer74;
+ bSizer74 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelLeft->SetMinSize( wxSize( 1,-1 ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
+
+ bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
+
+ bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panelLeft->SetSizer( bSizer134 );
+ m_panelLeft->Layout();
+ bSizer134->Fit( m_panelLeft );
+ bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxEXPAND, 5 );
+
+ m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer95;
+ bSizer95 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
+
+ m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panel20->SetSizer( bSizer95 );
+ m_panel20->Layout();
+ bSizer95->Fit( m_panel20 );
+ bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+ m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelRight->SetMinSize( wxSize( 1,-1 ) );
+
+ wxBoxSizer* bSizer135;
+ bSizer135 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
+
+ bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panelRight->SetSizer( bSizer135 );
+ m_panelRight->Layout();
+ bSizer135->Fit( m_panelRight );
+ bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer74 );
+ this->Layout();
+ bSizer74->Fit( this );
+}
+
+FolderPairPanelGenerated::~FolderPairPanelGenerated()
+{
+}
+
+CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer40;
+ bSizer40 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer40->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
+ m_textCtrlStatus->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer40->Add( m_textCtrlStatus, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+ m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH );
+ bSizer40->Add( m_gauge2, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ bSizer42 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer162StretchSpeedAndRemTimeIndependently;
+ bSizer162StretchSpeedAndRemTimeIndependently = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer157;
+ bSizer157 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerFilesFound = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText321 = new wxStaticText( this, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText321->Wrap( -1 );
+ bSizerFilesFound->Add( m_staticText321, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextScanned->Wrap( -1 );
+ m_staticTextScanned->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerFilesFound->Add( m_staticTextScanned, 0, wxALIGN_BOTTOM|wxLEFT, 5 );
+
+
+ bSizer157->Add( bSizerFilesFound, 0, 0, 5 );
+
+ bSizerFilesRemaining = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText46 = new wxStaticText( this, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText46->Wrap( -1 );
+ bSizerFilesRemaining->Add( m_staticText46, 0, wxALIGN_BOTTOM, 5 );
+
+ wxBoxSizer* bSizer154;
+ bSizer154 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextFilesRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextFilesRemaining->Wrap( -1 );
+ m_staticTextFilesRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer154->Add( m_staticTextFilesRemaining, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDataRemaining->Wrap( -1 );
+ bSizer154->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM|wxLEFT, 5 );
+
+
+ bSizerFilesRemaining->Add( bSizer154, 0, wxALIGN_BOTTOM|wxLEFT, 5 );
+
+
+ bSizer157->Add( bSizerFilesRemaining, 0, 0, 5 );
+
+
+ bSizer162StretchSpeedAndRemTimeIndependently->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer162StretchSpeedAndRemTimeIndependently->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ sSizerSpeed = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText104 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText104->Wrap( -1 );
+ sSizerSpeed->Add( m_staticText104, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextSpeed->Wrap( -1 );
+ m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ sSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer162StretchSpeedAndRemTimeIndependently->Add( sSizerSpeed, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer42->Add( bSizer162StretchSpeedAndRemTimeIndependently, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer42->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer163;
+ bSizer163 = new wxBoxSizer( wxHORIZONTAL );
+
+ sSizerTimeRemaining = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextTimeRemFixed = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeRemFixed->Wrap( -1 );
+ sSizerTimeRemaining->Add( m_staticTextTimeRemFixed, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextRemTime = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextRemTime->Wrap( -1 );
+ m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ sSizerTimeRemaining->Add( m_staticTextRemTime, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer163->Add( sSizerTimeRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer163->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ sSizerTimeElapsed = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticText* m_staticText37;
+ m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText37->Wrap( -1 );
+ sSizerTimeElapsed->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeElapsed->Wrap( -1 );
+ m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ sSizerTimeElapsed->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer163->Add( sSizerTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer42->Add( bSizer163, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer40->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer40 );
+ this->Layout();
+ bSizer40->Fit( this );
+}
+
+CompareProgressDlgGenerated::~CompareProgressDlgGenerated()
+{
+}
+
+SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+ bSizerRoot = new wxBoxSizer( wxVERTICAL );
+
+ bSizer42 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer42->Add( 32, 0, 0, 0, 5 );
+
+
+ bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
+ bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+ m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextPhase->Wrap( -1 );
+ m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+
+ m_animCtrlSyncing = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 32,32 ), wxAC_DEFAULT_STYLE );
+ bSizer42->Add( m_animCtrlSyncing, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+
+ bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), wxBU_AUTODRAW );
+ m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
+
+ bSizer42->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerRoot->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+ bSizerStatusText = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatus->Wrap( -1 );
+ bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 10 );
+
+
+ bSizerStatusText->Add( 0, 5, 0, 0, 5 );
+
+
+ bSizerRoot->Add( bSizerStatusText, 0, wxEXPAND, 5 );
+
+ wxStaticLine* m_staticlineHeader;
+ m_staticlineHeader = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerRoot->Add( m_staticlineHeader, 0, wxEXPAND, 5 );
+
+ m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelProgress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer171 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer171->Add( 10, 0, 0, 0, 5 );
+
+ wxBoxSizer* bSizer164;
+ bSizer164 = new wxBoxSizer( wxVERTICAL );
+
+ m_panelItemsProcessed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText96;
+ m_staticText96 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ bSizer165->Add( m_staticText96, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer169;
+ bSizer169 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextProcessedObj = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticTextProcessedObj->Wrap( -1 );
+ m_staticTextProcessedObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer169->Add( m_staticTextProcessedObj, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextDataProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDataProcessed->Wrap( -1 );
+ bSizer169->Add( m_staticTextDataProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer165->Add( bSizer169, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsProcessed->SetSizer( bSizer165 );
+ m_panelItemsProcessed->Layout();
+ bSizer165->Fit( m_panelItemsProcessed );
+ bSizer164->Add( m_panelItemsProcessed, 0, wxEXPAND|wxTOP, 7 );
+
+ m_panelItemsRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText97;
+ m_staticText97 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText97->Wrap( -1 );
+ bSizer166->Add( m_staticText97, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer170;
+ bSizer170 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextRemainingObj = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticTextRemainingObj->Wrap( -1 );
+ m_staticTextRemainingObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer170->Add( m_staticTextRemainingObj, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextDataRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDataRemaining->Wrap( -1 );
+ bSizer170->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer166->Add( bSizer170, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsRemaining->SetSizer( bSizer166 );
+ m_panelItemsRemaining->Layout();
+ bSizer166->Fit( m_panelItemsRemaining );
+ bSizer164->Add( m_panelItemsRemaining, 0, wxTOP|wxEXPAND, 7 );
+
+ m_panelTimeRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelTimeRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer167;
+ bSizer167 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer167->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText98;
+ m_staticText98 = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText98->Wrap( -1 );
+ bSizer167->Add( m_staticText98, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextRemTime = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextRemTime->Wrap( -1 );
+ m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer167->Add( m_staticTextRemTime, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer167->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelTimeRemaining->SetSizer( bSizer167 );
+ m_panelTimeRemaining->Layout();
+ bSizer167->Fit( m_panelTimeRemaining );
+ bSizer164->Add( m_panelTimeRemaining, 0, wxTOP|wxEXPAND, 7 );
+
+ wxPanel* m_panelTimeElapsed;
+ m_panelTimeElapsed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer168;
+ bSizer168 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText961;
+ m_staticText961 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText961->Wrap( -1 );
+ bSizer168->Add( m_staticText961, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextTimeElapsed = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeElapsed->Wrap( -1 );
+ m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer168->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelTimeElapsed->SetSizer( bSizer168 );
+ m_panelTimeElapsed->Layout();
+ bSizer168->Fit( m_panelTimeElapsed );
+ bSizer164->Add( m_panelTimeElapsed, 0, wxTOP|wxEXPAND, 7 );
+
+
+ bSizer171->Add( bSizer164, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer171->Add( 10, 0, 0, 0, 5 );
+
+ wxBoxSizer* bSizer161;
+ bSizer161 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer161->Add( 0, 15, 0, 0, 5 );
+
+ m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer161->Add( m_panelGraphBytes, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer161->Add( m_panelGraphItems, 1, wxEXPAND, 5 );
+
+
+ bSizer161->Add( 430, 0, 0, 0, 5 );
+
+
+ bSizer171->Add( bSizer161, 1, wxEXPAND, 5 );
+
+
+ bSizer171->Add( 0, 230, 0, 0, 5 );
+
+
+ bSizer173->Add( bSizer171, 1, wxEXPAND, 5 );
+
+
+ m_panelProgress->SetSizer( bSizer173 );
+ m_panelProgress->Layout();
+ bSizer173->Fit( m_panelProgress );
+ bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 );
+
+ m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH );
+
+ bSizerRoot->Add( m_notebookResult, 1, wxEXPAND, 5 );
+
+ m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerExecFinished = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText87 = new wxStaticText( this, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText87->Wrap( -1 );
+ bSizerExecFinished->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_comboBoxExecFinished = new ExecFinishedBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer160->Add( bSizerExecFinished, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer160->Add( 0, 0, 0, 0, 5 );
+
+
+ bSizerStdButtons->Add( bSizer160, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+ m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonClose->SetDefault();
+ m_buttonClose->Enable( false );
+
+ bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ m_buttonStop = new wxButton( this, wxID_CANCEL, _("Stop"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonStop, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizerRoot->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizerRoot );
+ this->Layout();
+ bSizerRoot->Fit( this );
+}
+
+SyncProgressPanelGenerated::~SyncProgressPanelGenerated()
+{
+}
+
+LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
+{
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer179;
+ bSizer179 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer153;
+ bSizer153 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer154;
+ bSizer154 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 );
+
+ m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMessages->SetScrollRate( 5, 5 );
+ bSizer153->Add( m_gridMessages, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer179->Add( bSizer153, 1, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer179 );
+ this->Layout();
+ bSizer179->Fit( this );
+
+ // Connect Events
+ m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnErrors ), NULL, this );
+ m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnWarnings ), NULL, this );
+ m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnInfo ), NULL, this );
+}
+
+LogPanelGenerated::~LogPanelGenerated()
+{
+}
+
+BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer54;
+ bSizer54 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextDescr = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDescr->Wrap( 520 );
+ bSizer72->Add( m_staticTextDescr, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer54->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 );
+
+ m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer171;
+ bSizer171 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText82 = new wxStaticText( m_panel35, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText82->Wrap( -1 );
+ bSizer171->Add( m_staticText82, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer169;
+ bSizer169 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_toggleBtnErrorIgnore = new wxToggleButton( m_panel35, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") );
+
+ bSizer169->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_toggleBtnErrorPopup = new wxToggleButton( m_panel35, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") );
+
+ bSizer169->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_toggleBtnErrorStop = new wxToggleButton( m_panel35, wxID_ANY, _("Stop"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorStop->SetToolTip( _("Stop synchronization at first error") );
+
+ bSizer169->Add( m_toggleBtnErrorStop, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer171->Add( bSizer169, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer180->Add( bSizer171, 0, wxALL, 5 );
+
+ m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer170;
+ bSizer170 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxShowProgress = new wxCheckBox( m_panel35, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer170->Add( m_checkBoxShowProgress, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer179;
+ bSizer179 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText81 = new wxStaticText( m_panel35, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText81->Wrap( -1 );
+ bSizer179->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_comboBoxExecFinished = new ExecFinishedBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer179->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer170->Add( bSizer179, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer180->Add( bSizer170, 1, wxALL, 5 );
+
+
+ bSizer172->Add( bSizer180, 0, wxEXPAND, 5 );
+
+ m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer191;
+ bSizer191 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxGenerateLogfile = new wxCheckBox( m_panel35, wxID_ANY, _("Save log:"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer191->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ m_panelLogfile = new wxPanel( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer1721;
+ bSizer1721 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_logfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer1721->Add( m_logfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectLogfileDir->SetToolTip( _("Select a folder") );
+
+ bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") );
+
+ bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") );
+
+ bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panelLogfile->SetSizer( bSizer1721 );
+ m_panelLogfile->Layout();
+ bSizer1721->Fit( m_panelLogfile );
+ bSizer191->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer172->Add( bSizer191, 0, wxEXPAND|wxALL, 10 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panel35, wxID_ANY, _("How can I schedule a batch job?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer172->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ m_panel35->SetSizer( bSizer172 );
+ m_panel35->Layout();
+ bSizer172->Fit( m_panel35 );
+ bSizer54->Add( m_panel35, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_buttonSaveAs = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonSaveAs->SetDefault();
+ m_buttonSaveAs->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonSaveAs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer54 );
+ this->Layout();
+ bSizer54->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) );
+ m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this );
+ m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this );
+ m_toggleBtnErrorStop->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorStop ), NULL, this );
+ m_checkBoxGenerateLogfile->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this );
+ m_checkBoxLogfilesLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( BatchDlgGenerated::OnHelpScheduleBatch ), NULL, this );
+ m_buttonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this );
+}
+
+BatchDlgGenerated::~BatchDlgGenerated()
+{
+}
+
+DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer24;
+ bSizer24 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer72->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER );
+ m_staticTextHeader->Wrap( -1 );
+ bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer24->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 );
+
+ m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer185->Add( 60, 0, 0, 0, 5 );
+
+ m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 );
+
+ m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 500,200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panel31->SetSizer( bSizer185 );
+ m_panel31->Layout();
+ bSizer185->Fit( m_panel31 );
+ bSizer24->Add( m_panel31, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer99;
+ bSizer99 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxDeleteBothSides->Hide();
+ m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") );
+
+ bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxLEFT, 5 );
+
+
+ bSizerStdButtons->Add( bSizer99, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOK->SetDefault();
+ m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer24 );
+ this->Layout();
+ bSizer24->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) );
+ m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this );
+ m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this );
+ m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this );
+}
+
+DeleteDlgGenerated::~DeleteDlgGenerated()
+{
+}
+
+FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer21;
+ bSizer21 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilter = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer72->Add( m_bitmapFilter, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticText44 = new wxStaticText( this, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticText44->Wrap( 480 );
+ bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer21->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline17 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer21->Add( m_staticline17, 0, wxEXPAND, 5 );
+
+ m_panel38 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel38->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer159;
+ bSizer159 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer166->Add( 0, 10, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1661;
+ bSizer1661 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapInclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
+ bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText78 = new wxStaticText( m_panel38, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText78->Wrap( -1 );
+ bSizer173->Add( m_staticText78, 0, 0, 5 );
+
+ m_textCtrlInclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
+ m_textCtrlInclude->SetMinSize( wxSize( 280,-1 ) );
+
+ bSizer173->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 5 );
+
+
+ bSizer1661->Add( bSizer173, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( bSizer1661, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxLEFT, 5 );
+
+ m_staticline22 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 );
+
+
+ bSizer166->Add( 0, 10, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1651;
+ bSizer1651 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapExclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
+ bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer189;
+ bSizer189 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText77 = new wxStaticText( m_panel38, wxID_ANY, _("Exclude:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText77->Wrap( -1 );
+ bSizer189->Add( m_staticText77, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer189->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panel38, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer189->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer174->Add( bSizer189, 0, wxEXPAND, 5 );
+
+ m_textCtrlExclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
+ bSizer174->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
+
+
+ bSizer1651->Add( bSizer174, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( bSizer1651, 2, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 );
+
+
+ bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_staticline24 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer159->Add( m_staticline24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer167;
+ bSizer167 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilterDate = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 );
+ bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText79 = new wxStaticText( m_panel38, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText79->Wrap( -1 );
+ bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 );
+
+ m_spinCtrlTimespan = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer165->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxArrayString m_choiceUnitTimespanChoices;
+ m_choiceUnitTimespan = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 );
+ m_choiceUnitTimespan->SetSelection( 0 );
+ bSizer165->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
+
+ m_staticline23 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer168;
+ bSizer168 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilterSize = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
+ bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer158;
+ bSizer158 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText80 = new wxStaticText( m_panel38, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText80->Wrap( -1 );
+ bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText101 = new wxStaticText( m_panel38, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText101->Wrap( -1 );
+ bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 );
+
+ m_spinCtrlMinSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxArrayString m_choiceUnitMinSizeChoices;
+ m_choiceUnitMinSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 );
+ m_choiceUnitMinSize->SetSelection( 0 );
+ bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer163;
+ bSizer163 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText102 = new wxStaticText( m_panel38, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText102->Wrap( -1 );
+ bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 );
+
+ m_spinCtrlMaxSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxArrayString m_choiceUnitMaxSizeChoices;
+ m_choiceUnitMaxSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 );
+ m_choiceUnitMaxSize->SetSelection( 0 );
+ bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer158->Add( bSizer163, 0, wxEXPAND, 5 );
+
+
+ bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer168, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
+
+
+ bSizer159->Add( bSizer160, 0, wxEXPAND, 5 );
+
+
+ m_panel38->SetSizer( bSizer159 );
+ m_panel38->Layout();
+ bSizer159->Fit( m_panel38 );
+ bSizer21->Add( m_panel38, 1, wxEXPAND, 5 );
+
+ m_staticline16 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer21->Add( m_staticline16, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonClear = new wxButton( this, wxID_DEFAULT, _("&Clear"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonClear, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOk->SetDefault();
+ m_buttonOk->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOk, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer21->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer21 );
+ this->Layout();
+ bSizer21->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) );
+ m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( FilterDlgGenerated::OnHelpShowExamples ), NULL, this );
+ m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
+ m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
+ m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
+ m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
+ m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnClear ), NULL, this );
+ m_buttonOk->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this );
+}
+
+FilterDlgGenerated::~FilterDlgGenerated()
+{
+}
+
+GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer95;
+ bSizer95 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticText44 = new wxStaticText( this, wxID_ANY, _("The following settings are used for all synchronization jobs."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticText44->Wrap( 500 );
+ bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer95->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 );
+
+ m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer186;
+ bSizer186 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer176;
+ bSizer176 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxFailSafe = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxFailSafe->SetValue(true);
+ m_checkBoxFailSafe->SetToolTip( _("Copy to a temporary file (*.ffs_tmp) before overwriting target.\nThis guarantees a consistent state even in case of a serious error.") );
+
+ bSizer176->Add( m_checkBoxFailSafe, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText91 = new wxStaticText( m_panel39, wxID_ANY, _("(recommended)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText91->Wrap( -1 );
+ m_staticText91->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer176->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer176, 0, wxEXPAND, 5 );
+
+ bSizerLockedFiles = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxCopyLocked->SetValue(true);
+ m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using the Volume Shadow Copy Service.") );
+
+ bSizerLockedFiles->Add( m_checkBoxCopyLocked, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText92 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText92->Wrap( -1 );
+ m_staticText92->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizerLockedFiles->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxCopyPermissions->SetValue(true);
+ m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and folder permissions.") );
+
+ bSizer178->Add( m_checkBoxCopyPermissions, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_staticText93 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText93->Wrap( -1 );
+ m_staticText93->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer178->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer178, 0, wxEXPAND, 5 );
+
+
+ bSizer186->Add( bSizer160, 0, wxEXPAND|wxALL, 5 );
+
+ m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer188;
+ bSizer188 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText95 = new wxStaticText( m_panel39, wxID_ANY, _("Automatic retry on error:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText95->Wrap( -1 );
+ bSizer188->Add( m_staticText95, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+
+ wxFlexGridSizer* fgSizer6;
+ fgSizer6 = new wxFlexGridSizer( 0, 2, 5, 5 );
+ fgSizer6->SetFlexibleDirection( wxBOTH );
+ fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticText96 = new wxStaticText( m_panel39, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ fgSizer6->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 4 );
+ fgSizer6->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextAutoRetryDelay = new wxStaticText( m_panel39, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextAutoRetryDelay->Wrap( -1 );
+ fgSizer6->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ fgSizer6->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer188->Add( fgSizer6, 0, wxLEFT, 10 );
+
+
+ bSizer186->Add( bSizer188, 0, wxALL, 10 );
+
+
+ bSizer166->Add( bSizer186, 0, wxEXPAND, 5 );
+
+ m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer166->Add( m_staticline191, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText85->Wrap( -1 );
+ bSizer181->Add( m_staticText85, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+
+ m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+
+ // Grid
+ m_gridCustomCommand->CreateGrid( 5, 2 );
+ m_gridCustomCommand->EnableEditing( true );
+ m_gridCustomCommand->EnableGridLines( true );
+ m_gridCustomCommand->EnableDragGridSize( false );
+ m_gridCustomCommand->SetMargins( 0, 0 );
+
+ // Columns
+ m_gridCustomCommand->SetColSize( 0, 165 );
+ m_gridCustomCommand->SetColSize( 1, 196 );
+ m_gridCustomCommand->EnableDragColMove( false );
+ m_gridCustomCommand->EnableDragColSize( true );
+ m_gridCustomCommand->SetColLabelSize( 20 );
+ m_gridCustomCommand->SetColLabelValue( 0, _("Description") );
+ m_gridCustomCommand->SetColLabelValue( 1, _("Command line") );
+ m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
+
+ // Rows
+ m_gridCustomCommand->EnableDragRowSize( false );
+ m_gridCustomCommand->SetRowLabelSize( 1 );
+ m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
+
+ // Label Appearance
+
+ // Cell Defaults
+ m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
+ bSizer181->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer193;
+ bSizer193 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonAddRow, 0, 0, 5 );
+
+ m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonRemoveRow, 0, 0, 5 );
+
+
+ bSizer193->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer193->Add( m_hyperlink17, 0, wxLEFT, 5 );
+
+
+ bSizer181->Add( bSizer193, 0, wxTOP|wxEXPAND, 5 );
+
+
+ bSizer166->Add( bSizer181, 1, wxEXPAND|wxALL, 10 );
+
+ m_staticline192 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer166->Add( m_staticline192, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer1881;
+ bSizer1881 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("Restore hidden windows"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer1881->Add( m_buttonResetDialogs, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
+
+ m_staticline40 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1881->Add( m_staticline40, 0, wxEXPAND, 5 );
+
+
+ bSizer166->Add( bSizer1881, 0, 0, 5 );
+
+
+ m_panel39->SetSizer( bSizer166 );
+ m_panel39->Layout();
+ bSizer166->Fit( m_panel39 );
+ bSizer95->Add( m_panel39, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonDefault = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonDefault, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, 0, 5 );
+
+ m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOkay->SetDefault();
+ m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer95 );
+ this->Layout();
+ bSizer95->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) );
+ m_spinCtrlAutoRetryCount->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnToggleAutoRetryCount ), NULL, this );
+ m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this );
+ m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( GlobalSettingsDlgGenerated::OnHelpShowExamples ), NULL, this );
+ m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this );
+ m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this );
+ m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this );
+}
+
+GlobalSettingsDlgGenerated::~GlobalSettingsDlgGenerated()
+{
+}
+
+TooltipDialogGenerated::TooltipDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer158;
+ bSizer158 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMain->Wrap( 600 );
+ bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ this->SetSizer( bSizer158 );
+ this->Layout();
+ bSizer158->Fit( this );
+}
+
+TooltipDialogGenerated::~TooltipDialogGenerated()
+{
+}
+
+SelectTimespanDlgGenerated::SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer96;
+ bSizer96 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer98;
+ bSizer98 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
+ bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
+ bSizer98->Add( m_calendarTo, 0, wxALL, 10 );
+
+
+ m_panel35->SetSizer( bSizer98 );
+ m_panel35->Layout();
+ bSizer98->Fit( m_panel35 );
+ bSizer96->Add( m_panel35, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOkay->SetDefault();
+ m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer96 );
+ this->Layout();
+ bSizer96->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) );
+ m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this );
+ m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this );
+ m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this );
+}
+
+SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated()
+{
+}
+
+AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer31;
+ bSizer31 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer162->Add( m_bitmapLogo, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer162->Add( m_staticline341, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer187;
+ bSizer187 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText96 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ bSizer187->Add( m_staticText96, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer171;
+ bSizer171 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink11->SetToolTip( _("http://msdn.microsoft.com/library/60k1461a.aspx") );
+
+ bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink9->SetToolTip( _("http://www.mingw.org") );
+
+ bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink10->SetToolTip( _("http://www.codeblocks.org") );
+
+ bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink7->SetToolTip( _("http://www.wxwidgets.org") );
+
+ bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink14->SetToolTip( _("http://wxformbuilder.org") );
+
+ bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer187->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zen::Xml"), wxT("http://zenxml.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink15->SetToolTip( _("http://zenxml.sourceforge.net") );
+
+ bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink13 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink13->SetToolTip( _("http://www.boost.org") );
+
+ bSizer172->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink16->SetToolTip( _("http://astyle.sourceforge.net") );
+
+ bSizer172->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink12->SetToolTip( _("http://code.google.com/p/googletest") );
+
+ bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink18->SetToolTip( _("http://www.scratchpaper.com") );
+
+ bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer187->Add( bSizer172, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer181->Add( bSizer187, 0, wxALL|wxEXPAND, 5 );
+
+ m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) );
+
+ wxBoxSizer* bSizer183;
+ bSizer183 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel39 = new wxPanel( m_panelDonate, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel39->SetBackgroundColour( wxColour( 221, 221, 255 ) );
+
+ wxBoxSizer* bSizer184;
+ bSizer184 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_animCtrlWink = new wxAnimationCtrl( m_panel39, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 48,48 ), wxAC_DEFAULT_STYLE );
+ bSizer184->Add( m_animCtrlWink, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText83 = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText83->Wrap( -1 );
+ m_staticText83->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_staticText83->SetForegroundColour( wxColour( 0, 0, 0 ) );
+
+ bSizer178->Add( m_staticText83, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Donate with PayPal"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
+ m_buttonDonate->SetToolTip( _("http://freefilesync.sourceforge.net/donate.php") );
+
+ bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer184->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panel39->SetSizer( bSizer184 );
+ m_panel39->Layout();
+ bSizer184->Fit( m_panel39 );
+ bSizer183->Add( m_panel39, 0, wxEXPAND|wxALL, 5 );
+
+
+ m_panelDonate->SetSizer( bSizer183 );
+ m_panelDonate->Layout();
+ bSizer183->Fit( m_panelDonate );
+ bSizer181->Add( m_panelDonate, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer186;
+ bSizer186 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText94->Wrap( -1 );
+ bSizer186->Add( m_staticText94, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmap9 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_bitmap9->SetToolTip( _("Homepage") );
+
+ bSizer166->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("freefilesync.sf.net"), wxT("http://freefilesync.sf.net/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
+ m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer166->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmap10 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_bitmap10->SetToolTip( _("Email") );
+
+ bSizer166->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zenju@gmx.de"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
+ m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer166->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ bSizer186->Add( bSizer166, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer181->Add( bSizer186, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer181->Add( m_staticline34, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText93->Wrap( -1 );
+ bSizer185->Add( m_staticText93, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer1671;
+ bSizer1671 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmap13 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer1671->Add( m_bitmap13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer185->Add( bSizer1671, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer181->Add( bSizer185, 0, wxALL|wxEXPAND, 5 );
+
+
+ bSizer174->Add( bSizer181, 0, 0, 5 );
+
+ m_staticline37 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer174->Add( m_staticline37, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer177;
+ bSizer177 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText54 = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText54->Wrap( 200 );
+ m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer177->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
+
+ bSizer177->Add( 0, 5, 0, 0, 5 );
+
+ m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxVSCROLL );
+ m_scrolledWindowTranslators->SetScrollRate( 10, 10 );
+ m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_scrolledWindowTranslators->SetMinSize( wxSize( 220,-1 ) );
+
+ fgSizerTranslators = new wxFlexGridSizer( 0, 2, 2, 10 );
+ fgSizerTranslators->SetFlexibleDirection( wxBOTH );
+ fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+
+ m_scrolledWindowTranslators->SetSizer( fgSizerTranslators );
+ m_scrolledWindowTranslators->Layout();
+ fgSizerTranslators->Fit( m_scrolledWindowTranslators );
+ bSizer177->Add( m_scrolledWindowTranslators, 1, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxEXPAND, 5 );
+
+
+ bSizer174->Add( bSizer177, 0, wxEXPAND|wxTOP|wxLEFT, 5 );
+
+
+ bSizer162->Add( bSizer174, 0, 0, 5 );
+
+
+ m_panel41->SetSizer( bSizer162 );
+ m_panel41->Layout();
+ bSizer162->Fit( m_panel41 );
+ bSizer31->Add( m_panel41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonClose->SetDefault();
+ bSizerStdButtons->Add( m_buttonClose, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer31->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer31 );
+ this->Layout();
+ bSizer31->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) );
+ m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this );
+ m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this );
+}
+
+AboutDlgGenerated::~AboutDlgGenerated()
+{
+}
diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h
new file mode 100644
index 00000000..e87529b1
--- /dev/null
+++ b/FreeFileSync/Source/ui/gui_generated.h
@@ -0,0 +1,880 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version Oct 8 2012)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO "NOT" EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#ifndef __GUI_GENERATED_H__
+#define __GUI_GENERATED_H__
+
+#include <wx/artprov.h>
+#include <wx/xrc/xmlres.h>
+#include <wx/intl.h>
+class ExecFinishedBox;
+class FolderHistoryBox;
+class ToggleButton;
+namespace zen{ class BitmapTextButton; }
+namespace zen{ class Graph2D; }
+namespace zen{ class Grid; }
+namespace zen{ class TripleSplitter; }
+
+#include <wx/string.h>
+#include <wx/bitmap.h>
+#include <wx/image.h>
+#include <wx/icon.h>
+#include <wx/menu.h>
+#include <wx/gdicmn.h>
+#include <wx/font.h>
+#include <wx/colour.h>
+#include <wx/settings.h>
+#include <wx/button.h>
+#include <wx/bmpbuttn.h>
+#include <wx/sizer.h>
+#include <wx/panel.h>
+#include <wx/stattext.h>
+#include <wx/combobox.h>
+#include <wx/scrolwin.h>
+#include <wx/statbmp.h>
+#include <wx/statline.h>
+#include <wx/textctrl.h>
+#include <wx/checkbox.h>
+#include <wx/listbox.h>
+#include <wx/frame.h>
+#include <wx/tglbtn.h>
+#include <wx/choice.h>
+#include <wx/hyperlink.h>
+#include <wx/dialog.h>
+#include <wx/gauge.h>
+#include <wx/animate.h>
+#include <wx/notebook.h>
+#include <wx/spinctrl.h>
+#include <wx/grid.h>
+#include <wx/calctrl.h>
+
+#include "zen/i18n.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class MainDialogGenerated
+///////////////////////////////////////////////////////////////////////////////
+class MainDialogGenerated : public wxFrame
+{
+ private:
+
+ protected:
+ wxMenuBar* m_menubar1;
+ wxMenu* m_menuFile;
+ wxMenuItem* m_menuItemNew;
+ wxMenuItem* m_menuItemLoad;
+ wxMenuItem* m_menuItemSave;
+ wxMenuItem* m_menuItemSaveAs;
+ wxMenuItem* m_menuItem7;
+ wxMenuItem* m_menuItem10;
+ wxMenuItem* m_menuItem11;
+ wxMenu* m_menuTools;
+ wxMenuItem* m_menuItemGlobSett;
+ wxMenu* m_menuLanguages;
+ wxMenu* m_menuHelp;
+ wxMenuItem* m_menuItemManual;
+ wxMenu* m_menuCheckVersion;
+ wxMenuItem* m_menuItemCheckVersionNow;
+ wxMenuItem* m_menuItemCheckVersionAuto;
+ wxMenuItem* m_menuItemAbout;
+ wxBoxSizer* bSizerPanelHolder;
+ wxPanel* m_panelTopButtons;
+ wxBoxSizer* bSizerTopButtons;
+ zen::BitmapTextButton* m_buttonCompare;
+ zen::BitmapTextButton* m_buttonCancel;
+ wxBitmapButton* m_bpButtonCmpConfig;
+ wxBitmapButton* m_bpButtonSyncConfig;
+ zen::BitmapTextButton* m_buttonSync;
+ wxPanel* m_panelDirectoryPairs;
+ wxStaticText* m_staticTextResolvedPathL;
+ wxBitmapButton* m_bpButtonAddPair;
+ wxButton* m_buttonSelectDirLeft;
+ wxPanel* m_panelTopMiddle;
+ wxBitmapButton* m_bpButtonSwapSides;
+ wxStaticText* m_staticTextResolvedPathR;
+ wxButton* m_buttonSelectDirRight;
+ wxScrolledWindow* m_scrolledWindowFolderPairs;
+ wxBoxSizer* bSizerAddFolderPairs;
+ zen::Grid* m_gridNavi;
+ wxPanel* m_panelCenter;
+ zen::TripleSplitter* m_splitterMain;
+ zen::Grid* m_gridMainL;
+ zen::Grid* m_gridMainC;
+ zen::Grid* m_gridMainR;
+ wxPanel* m_panelStatusBar;
+ wxBoxSizer* bSizerFileStatus;
+ wxBoxSizer* bSizerStatusLeft;
+ wxBoxSizer* bSizerStatusLeftDirectories;
+ wxStaticBitmap* m_bitmapSmallDirectoryLeft;
+ wxStaticText* m_staticTextStatusLeftDirs;
+ wxBoxSizer* bSizerStatusLeftFiles;
+ wxStaticBitmap* m_bitmapSmallFileLeft;
+ wxStaticText* m_staticTextStatusLeftFiles;
+ wxStaticText* m_staticTextStatusLeftBytes;
+ wxStaticLine* m_staticline9;
+ wxStaticText* m_staticTextStatusMiddle;
+ wxBoxSizer* bSizerStatusRight;
+ wxStaticLine* m_staticline10;
+ wxBoxSizer* bSizerStatusRightDirectories;
+ wxStaticBitmap* m_bitmapSmallDirectoryRight;
+ wxStaticText* m_staticTextStatusRightDirs;
+ wxBoxSizer* bSizerStatusRightFiles;
+ wxStaticBitmap* m_bitmapSmallFileRight;
+ wxStaticText* m_staticTextStatusRightFiles;
+ wxStaticText* m_staticTextStatusRightBytes;
+ wxStaticText* m_staticTextFullStatus;
+ wxPanel* m_panelSearch;
+ wxBitmapButton* m_bpButtonHideSearch;
+ wxStaticText* m_staticText101;
+ wxTextCtrl* m_textCtrlSearchTxt;
+ wxCheckBox* m_checkBoxMatchCase;
+ wxPanel* m_panelConfig;
+ wxBoxSizer* bSizerConfig;
+ wxBitmapButton* m_bpButtonOpen;
+ wxBitmapButton* m_bpButtonSave;
+ wxBitmapButton* m_bpButtonBatchJob;
+ wxListBox* m_listBoxHistory;
+ wxPanel* m_panelFilter;
+ wxBitmapButton* m_bpButtonFilter;
+ wxCheckBox* m_checkBoxHideExcluded;
+ wxPanel* m_panelStatistics;
+ wxBoxSizer* bSizer1801;
+ wxStaticBitmap* m_bitmapCreateLeft;
+ wxStaticText* m_staticTextCreateLeft;
+ wxStaticBitmap* m_bitmapUpdateLeft;
+ wxStaticText* m_staticTextUpdateLeft;
+ wxStaticBitmap* m_bitmapDeleteLeft;
+ wxStaticText* m_staticTextDeleteLeft;
+ wxStaticBitmap* m_bitmapData;
+ wxStaticText* m_staticTextData;
+ wxStaticBitmap* m_bitmapDeleteRight;
+ wxStaticText* m_staticTextDeleteRight;
+ wxStaticBitmap* m_bitmapUpdateRight;
+ wxStaticText* m_staticTextUpdateRight;
+ wxStaticBitmap* m_bitmapCreateRight;
+ wxStaticText* m_staticTextCreateRight;
+ wxPanel* m_panelViewFilter;
+ wxBoxSizer* bSizerViewFilter;
+ ToggleButton* m_bpButtonViewTypeSyncAction;
+ ToggleButton* m_bpButtonShowCreateLeft;
+ ToggleButton* m_bpButtonShowUpdateLeft;
+ ToggleButton* m_bpButtonShowDeleteLeft;
+ ToggleButton* m_bpButtonShowLeftOnly;
+ ToggleButton* m_bpButtonShowLeftNewer;
+ ToggleButton* m_bpButtonShowEqual;
+ ToggleButton* m_bpButtonShowDifferent;
+ ToggleButton* m_bpButtonShowDoNothing;
+ ToggleButton* m_bpButtonShowRightNewer;
+ ToggleButton* m_bpButtonShowRightOnly;
+ ToggleButton* m_bpButtonShowDeleteRight;
+ ToggleButton* m_bpButtonShowUpdateRight;
+ ToggleButton* m_bpButtonShowCreateRight;
+ ToggleButton* m_bpButtonShowConflict;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnConfigNew( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConfigLoad( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConfigSave( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConfigSaveAs( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuGlobalSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuFindItem( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncSettingsContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHideSearchPanel( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSearchGridEnter( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); }
+ virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnLoadFromHistoryDoubleClick( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCfgHistoryRightClick( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnShowExcluded( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleViewType( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnViewButtonRightClick( wxMouseEvent& event ) { event.Skip(); }
+
+
+ public:
+ wxPanel* m_panelTopLeft;
+ wxBitmapButton* m_bpButtonRemovePair;
+ FolderHistoryBox* m_directoryLeft;
+ wxBitmapButton* m_bpButtonAltCompCfg;
+ wxBitmapButton* m_bpButtonLocalFilter;
+ wxBitmapButton* m_bpButtonAltSyncCfg;
+ wxPanel* m_panelTopRight;
+ FolderHistoryBox* m_directoryRight;
+ wxBoxSizer* bSizerStatistics;
+ wxBoxSizer* bSizerData;
+
+ MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 900,600 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
+
+ ~MainDialogGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class CmpCfgDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class CmpCfgDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxPanel* m_panel36;
+ wxStaticText* m_staticText91;
+ wxStaticBitmap* m_bitmapByTime;
+ wxToggleButton* m_toggleBtnTimeSize;
+ wxStaticBitmap* m_bitmapByContent;
+ wxToggleButton* m_toggleBtnContent;
+ wxStaticLine* m_staticline33;
+ wxStaticText* m_staticText92;
+ wxChoice* m_choiceHandleSymlinks;
+ wxHyperlinkCtrl* m_hyperlink24;
+ wxStaticLine* m_staticline14;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnContent( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpComparisonSettings( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE );
+ ~CmpCfgDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class SyncCfgDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class SyncCfgDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxPanel* m_panel37;
+ wxStaticText* m_staticText86;
+ wxToggleButton* m_toggleBtnTwoWay;
+ wxStaticText* m_staticTextAutomatic;
+ wxToggleButton* m_toggleBtnMirror;
+ wxStaticText* m_staticTextMirror;
+ wxToggleButton* m_toggleBtnUpdate;
+ wxStaticText* m_staticTextUpdate;
+ wxToggleButton* m_toggleBtnCustom;
+ wxStaticText* m_staticTextCustom;
+ wxCheckBox* m_checkBoxDetectMove;
+ wxStaticLine* m_staticline32;
+ wxStaticText* m_staticText87;
+ wxToggleButton* m_toggleBtnPermanent;
+ wxToggleButton* m_toggleBtnRecycler;
+ wxToggleButton* m_toggleBtnVersioning;
+ wxPanel* m_panelVersioning;
+ FolderHistoryBox* m_versioningFolder;
+ wxButton* m_buttonSelectDirVersioning;
+ wxBoxSizer* bSizer192;
+ wxStaticText* m_staticText93;
+ wxChoice* m_choiceVersioningStyle;
+ wxStaticText* m_staticTextNamingCvtPart1;
+ wxStaticText* m_staticTextNamingCvtPart2Bold;
+ wxStaticText* m_staticTextNamingCvtPart3;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxBoxSizer* bSizerExtraConfig;
+ wxStaticLine* m_staticline321;
+ wxBoxSizer* bSizer179;
+ wxStaticText* m_staticText88;
+ wxToggleButton* m_toggleBtnErrorIgnore;
+ wxToggleButton* m_toggleBtnErrorPopup;
+ wxStaticLine* m_staticline36;
+ wxBoxSizer* bSizerOnCompletion;
+ wxStaticText* m_staticText89;
+ ExecFinishedBox* m_comboBoxExecFinished;
+ wxStaticLine* m_staticline31;
+ wxBoxSizer* bSizerConfig;
+ wxStaticText* m_staticTextHeaderCategory1;
+ wxStaticText* m_staticTextHeaderAction1;
+ wxStaticBitmap* m_bitmapDatabase;
+ wxBoxSizer* sbSizerSyncDirections;
+ wxBoxSizer* bSizerLeftOnly;
+ wxStaticBitmap* m_bitmapLeftOnly;
+ wxBitmapButton* m_bpButtonLeftOnly;
+ wxBoxSizer* bSizerRightOnly;
+ wxStaticBitmap* m_bitmapRightOnly;
+ wxBitmapButton* m_bpButtonRightOnly;
+ wxBoxSizer* bSizerLeftNewer;
+ wxStaticBitmap* m_bitmapLeftNewer;
+ wxBitmapButton* m_bpButtonLeftNewer;
+ wxBoxSizer* bSizerRightNewer;
+ wxStaticBitmap* m_bitmapRightNewer;
+ wxBitmapButton* m_bpButtonRightNewer;
+ wxBoxSizer* bSizerDifferent;
+ wxStaticBitmap* m_bitmapDifferent;
+ wxBitmapButton* m_bpButtonDifferent;
+ wxBoxSizer* bSizerConflict;
+ wxStaticBitmap* m_bitmapConflict;
+ wxBitmapButton* m_bpButtonConflict;
+ wxStaticLine* m_staticline15;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOK;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncTwoWay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleDetectMovedFiles( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDeletionRecycler( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnParameterChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~SyncCfgDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class SyncConfirmationDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class SyncConfirmationDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxStaticBitmap* m_bitmapSync;
+ wxStaticText* m_staticTextHeader;
+ wxStaticLine* m_staticline371;
+ wxPanel* m_panelStatistics;
+ wxStaticLine* m_staticline38;
+ wxStaticText* m_staticText84;
+ wxStaticText* m_staticTextVariant;
+ wxStaticLine* m_staticline14;
+ wxStaticText* m_staticText83;
+ wxStaticBitmap* m_bitmapCreateLeft;
+ wxStaticBitmap* m_bitmapUpdateLeft;
+ wxStaticBitmap* m_bitmapDeleteLeft;
+ wxStaticBitmap* m_bitmapData;
+ wxStaticBitmap* m_bitmapDeleteRight;
+ wxStaticBitmap* m_bitmapUpdateRight;
+ wxStaticBitmap* m_bitmapCreateRight;
+ wxStaticText* m_staticTextCreateLeft;
+ wxStaticText* m_staticTextUpdateLeft;
+ wxStaticText* m_staticTextDeleteLeft;
+ wxStaticText* m_staticTextData;
+ wxStaticText* m_staticTextDeleteRight;
+ wxStaticText* m_staticTextUpdateRight;
+ wxStaticText* m_staticTextCreateRight;
+ wxStaticLine* m_staticline12;
+ wxCheckBox* m_checkBoxDontShowAgain;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonStartSync;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~SyncConfirmationDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class FolderPairPanelGenerated
+///////////////////////////////////////////////////////////////////////////////
+class FolderPairPanelGenerated : public wxPanel
+{
+ private:
+
+ protected:
+ wxButton* m_buttonSelectDirLeft;
+ wxButton* m_buttonSelectDirRight;
+
+ public:
+ wxPanel* m_panelLeft;
+ wxBitmapButton* m_bpButtonRemovePair;
+ FolderHistoryBox* m_directoryLeft;
+ wxPanel* m_panel20;
+ wxBitmapButton* m_bpButtonAltCompCfg;
+ wxBitmapButton* m_bpButtonLocalFilter;
+ wxBitmapButton* m_bpButtonAltSyncCfg;
+ wxPanel* m_panelRight;
+ FolderHistoryBox* m_directoryRight;
+
+ FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
+ ~FolderPairPanelGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class CompareProgressDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class CompareProgressDlgGenerated : public wxPanel
+{
+ private:
+
+ protected:
+ wxTextCtrl* m_textCtrlStatus;
+ wxGauge* m_gauge2;
+ wxBoxSizer* bSizer42;
+ wxBoxSizer* bSizerFilesFound;
+ wxStaticText* m_staticText321;
+ wxStaticText* m_staticTextScanned;
+ wxBoxSizer* bSizerFilesRemaining;
+ wxStaticText* m_staticText46;
+ wxStaticText* m_staticTextFilesRemaining;
+ wxStaticText* m_staticTextDataRemaining;
+ wxBoxSizer* sSizerSpeed;
+ wxStaticText* m_staticText104;
+ wxStaticText* m_staticTextSpeed;
+ wxBoxSizer* sSizerTimeRemaining;
+ wxStaticText* m_staticTextTimeRemFixed;
+ wxStaticText* m_staticTextRemTime;
+ wxBoxSizer* sSizerTimeElapsed;
+ wxStaticText* m_staticTextTimeElapsed;
+
+ public:
+
+ CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxRAISED_BORDER );
+ ~CompareProgressDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class SyncProgressPanelGenerated
+///////////////////////////////////////////////////////////////////////////////
+class SyncProgressPanelGenerated : public wxPanel
+{
+ private:
+
+ protected:
+ wxBoxSizer* bSizer42;
+ wxBoxSizer* bSizer171;
+ wxStaticText* m_staticText87;
+
+ public:
+ wxBoxSizer* bSizerRoot;
+ wxStaticBitmap* m_bitmapStatus;
+ wxStaticText* m_staticTextPhase;
+ wxAnimationCtrl* m_animCtrlSyncing;
+ wxBitmapButton* m_bpButtonMinimizeToTray;
+ wxBoxSizer* bSizerStatusText;
+ wxStaticText* m_staticTextStatus;
+ wxPanel* m_panelProgress;
+ wxPanel* m_panelItemsProcessed;
+ wxStaticText* m_staticTextProcessedObj;
+ wxStaticText* m_staticTextDataProcessed;
+ wxPanel* m_panelItemsRemaining;
+ wxStaticText* m_staticTextRemainingObj;
+ wxStaticText* m_staticTextDataRemaining;
+ wxPanel* m_panelTimeRemaining;
+ wxStaticText* m_staticTextRemTime;
+ wxStaticText* m_staticTextTimeElapsed;
+ zen::Graph2D* m_panelGraphBytes;
+ zen::Graph2D* m_panelGraphItems;
+ wxNotebook* m_notebookResult;
+ wxStaticLine* m_staticlineFooter;
+ wxBoxSizer* bSizerStdButtons;
+ wxBoxSizer* bSizerExecFinished;
+ ExecFinishedBox* m_comboBoxExecFinished;
+ wxButton* m_buttonClose;
+ wxButton* m_buttonPause;
+ wxButton* m_buttonStop;
+
+ SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~SyncProgressPanelGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class LogPanelGenerated
+///////////////////////////////////////////////////////////////////////////////
+class LogPanelGenerated : public wxPanel
+{
+ private:
+
+ protected:
+ ToggleButton* m_bpButtonErrors;
+ ToggleButton* m_bpButtonWarnings;
+ ToggleButton* m_bpButtonInfo;
+ wxStaticLine* m_staticline13;
+ zen::Grid* m_gridMessages;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnErrors( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnWarnings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnInfo( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
+ ~LogPanelGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class BatchDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class BatchDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxStaticBitmap* m_bitmapBatchJob;
+ wxStaticText* m_staticTextDescr;
+ wxStaticLine* m_staticline18;
+ wxPanel* m_panel35;
+ wxStaticText* m_staticText82;
+ wxToggleButton* m_toggleBtnErrorIgnore;
+ wxToggleButton* m_toggleBtnErrorPopup;
+ wxToggleButton* m_toggleBtnErrorStop;
+ wxStaticLine* m_staticline26;
+ wxCheckBox* m_checkBoxShowProgress;
+ wxStaticText* m_staticText81;
+ ExecFinishedBox* m_comboBoxExecFinished;
+ wxStaticLine* m_staticline25;
+ wxCheckBox* m_checkBoxGenerateLogfile;
+ wxPanel* m_panelLogfile;
+ wxButton* m_buttonSelectLogfileDir;
+ wxCheckBox* m_checkBoxLogfilesLimit;
+ wxSpinCtrl* m_spinCtrlLogfileLimit;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxStaticLine* m_staticline13;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonSaveAs;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorStop( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleGenerateLogfile( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpScheduleBatch( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+ FolderHistoryBox* m_logfileDir;
+
+ BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as Batch Job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
+ ~BatchDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class DeleteDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class DeleteDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxStaticBitmap* m_bitmapDeleteType;
+ wxStaticText* m_staticTextHeader;
+ wxStaticLine* m_staticline91;
+ wxPanel* m_panel31;
+ wxStaticLine* m_staticline42;
+ wxTextCtrl* m_textCtrlFileList;
+ wxStaticLine* m_staticline9;
+ wxBoxSizer* bSizerStdButtons;
+ wxCheckBox* m_checkBoxUseRecycler;
+ wxCheckBox* m_checkBoxDeleteBothSides;
+ wxButton* m_buttonOK;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDelOnBothSides( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ ~DeleteDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class FilterDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class FilterDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxStaticBitmap* m_bitmapFilter;
+ wxStaticText* m_staticText44;
+ wxStaticLine* m_staticline17;
+ wxPanel* m_panel38;
+ wxStaticBitmap* m_bitmapInclude;
+ wxStaticText* m_staticText78;
+ wxTextCtrl* m_textCtrlInclude;
+ wxStaticLine* m_staticline22;
+ wxStaticBitmap* m_bitmapExclude;
+ wxStaticText* m_staticText77;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxTextCtrl* m_textCtrlExclude;
+ wxStaticLine* m_staticline24;
+ wxStaticBitmap* m_bitmapFilterDate;
+ wxStaticText* m_staticText79;
+ wxSpinCtrl* m_spinCtrlTimespan;
+ wxChoice* m_choiceUnitTimespan;
+ wxStaticLine* m_staticline23;
+ wxStaticBitmap* m_bitmapFilterSize;
+ wxStaticText* m_staticText80;
+ wxStaticText* m_staticText101;
+ wxSpinCtrl* m_spinCtrlMinSize;
+ wxChoice* m_choiceUnitMinSize;
+ wxStaticText* m_staticText102;
+ wxSpinCtrl* m_spinCtrlMaxSize;
+ wxChoice* m_choiceUnitMaxSize;
+ wxStaticLine* m_staticline16;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonClear;
+ wxButton* m_buttonOk;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnClear( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ ~FilterDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class GlobalSettingsDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class GlobalSettingsDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxStaticBitmap* m_bitmapSettings;
+ wxStaticText* m_staticText44;
+ wxStaticLine* m_staticline20;
+ wxPanel* m_panel39;
+ wxCheckBox* m_checkBoxFailSafe;
+ wxStaticText* m_staticText91;
+ wxBoxSizer* bSizerLockedFiles;
+ wxCheckBox* m_checkBoxCopyLocked;
+ wxStaticText* m_staticText92;
+ wxCheckBox* m_checkBoxCopyPermissions;
+ wxStaticText* m_staticText93;
+ wxStaticLine* m_staticline39;
+ wxStaticText* m_staticText95;
+ wxStaticText* m_staticText96;
+ wxSpinCtrl* m_spinCtrlAutoRetryCount;
+ wxStaticText* m_staticTextAutoRetryDelay;
+ wxSpinCtrl* m_spinCtrlAutoRetryDelay;
+ wxStaticLine* m_staticline191;
+ wxStaticText* m_staticText85;
+ wxGrid* m_gridCustomCommand;
+ wxBitmapButton* m_bpButtonAddRow;
+ wxBitmapButton* m_bpButtonRemoveRow;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxStaticLine* m_staticline192;
+ zen::BitmapTextButton* m_buttonResetDialogs;
+ wxStaticLine* m_staticline40;
+ wxStaticLine* m_staticline36;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonDefault;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnToggleAutoRetryCount( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
+ ~GlobalSettingsDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class TooltipDialogGenerated
+///////////////////////////////////////////////////////////////////////////////
+class TooltipDialogGenerated : public wxDialog
+{
+ private:
+
+ protected:
+
+ public:
+ wxStaticBitmap* m_bitmapLeft;
+ wxStaticText* m_staticTextMain;
+
+ TooltipDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~TooltipDialogGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class SelectTimespanDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class SelectTimespanDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxPanel* m_panel35;
+ wxCalendarCtrl* m_calendarFrom;
+ wxCalendarCtrl* m_calendarTo;
+ wxStaticLine* m_staticline21;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); }
+ virtual void OnChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Time Span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~SelectTimespanDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class AboutDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class AboutDlgGenerated : public wxDialog
+{
+ private:
+
+ protected:
+ wxPanel* m_panel41;
+ wxStaticBitmap* m_bitmapLogo;
+ wxStaticLine* m_staticline341;
+ wxStaticText* m_staticText96;
+ wxHyperlinkCtrl* m_hyperlink11;
+ wxHyperlinkCtrl* m_hyperlink9;
+ wxHyperlinkCtrl* m_hyperlink10;
+ wxHyperlinkCtrl* m_hyperlink7;
+ wxHyperlinkCtrl* m_hyperlink14;
+ wxHyperlinkCtrl* m_hyperlink15;
+ wxHyperlinkCtrl* m_hyperlink13;
+ wxHyperlinkCtrl* m_hyperlink16;
+ wxHyperlinkCtrl* m_hyperlink12;
+ wxHyperlinkCtrl* m_hyperlink18;
+ wxPanel* m_panelDonate;
+ wxPanel* m_panel39;
+ wxAnimationCtrl* m_animCtrlWink;
+ wxStaticText* m_staticText83;
+ wxButton* m_buttonDonate;
+ wxStaticText* m_staticText94;
+ wxStaticBitmap* m_bitmap9;
+ wxHyperlinkCtrl* m_hyperlink1;
+ wxStaticBitmap* m_bitmap10;
+ wxHyperlinkCtrl* m_hyperlink2;
+ wxStaticLine* m_staticline34;
+ wxStaticText* m_staticText93;
+ wxStaticBitmap* m_bitmap13;
+ wxHyperlinkCtrl* m_hyperlink5;
+ wxStaticLine* m_staticline37;
+ wxStaticText* m_staticText54;
+ wxScrolledWindow* m_scrolledWindowTranslators;
+ wxFlexGridSizer* fgSizerTranslators;
+ wxStaticLine* m_staticline36;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonClose;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~AboutDlgGenerated();
+
+};
+
+#endif //__GUI_GENERATED_H__
diff --git a/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp
index f161b87b..ec856beb 100644
--- a/ui/gui_status_handler.cpp
+++ b/FreeFileSync/Source/ui/gui_status_handler.cpp
@@ -117,7 +117,7 @@ ProcessCallback::Response CompareStatusHandler::reportError(const std::wstring&
return ProcessCallback::RETRY;
case ConfirmationButton3::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
@@ -151,7 +151,7 @@ void CompareStatusHandler::reportWarning(const std::wstring& warningMessage, boo
warningActive = !dontWarnAgain;
break;
case ConfirmationButton::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
}
@@ -169,7 +169,7 @@ void CompareStatusHandler::OnAbortCompare(wxCommandEvent& event)
}
-void CompareStatusHandler::abortThisProcess()
+void CompareStatusHandler::abortProcessNow()
{
requestAbortion(); //just make sure...
throw GuiAbortProcess();
@@ -190,10 +190,8 @@ SyncStatusHandler::SyncStatusHandler(wxFrame* parentDlg,
handleError_(handleError),
automaticRetryCount_(automaticRetryCount),
automaticRetryDelay_(automaticRetryDelay),
- jobName_(jobName)
-{
- totalTime.Start(); //measure total time
-}
+ jobName_(jobName),
+startTime_(wxGetUTCTimeMillis().GetValue()) {}
SyncStatusHandler::~SyncStatusHandler()
@@ -260,7 +258,7 @@ SyncStatusHandler::~SyncStatusHandler()
jobName_, finalStatus,
getObjectsCurrent(PHASE_SYNCHRONIZING), getDataCurrent(PHASE_SYNCHRONIZING),
getObjectsTotal (PHASE_SYNCHRONIZING), getDataTotal (PHASE_SYNCHRONIZING),
- totalTime.Time() / 1000
+ (wxGetUTCTimeMillis().GetValue() - startTime_) / 1000
};
try
@@ -349,7 +347,7 @@ ProcessCallback::Response SyncStatusHandler::reportError(const std::wstring& err
{
case ON_GUIERROR_POPUP:
{
- if (!progressDlg) abortThisProcess();
+ if (!progressDlg) abortProcessNow();
PauseTimers dummy(*progressDlg);
forceUiRefresh();
@@ -370,7 +368,7 @@ ProcessCallback::Response SyncStatusHandler::reportError(const std::wstring& err
return ProcessCallback::RETRY;
case ConfirmationButton3::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
}
@@ -393,7 +391,7 @@ void SyncStatusHandler::reportFatalError(const std::wstring& errorMessage)
{
case ON_GUIERROR_POPUP:
{
- if (!progressDlg) abortThisProcess();
+ if (!progressDlg) abortProcessNow();
PauseTimers dummy(*progressDlg);
forceUiRefresh();
@@ -409,7 +407,7 @@ void SyncStatusHandler::reportFatalError(const std::wstring& errorMessage)
handleError_ = ON_GUIERROR_IGNORE;
break;
case ConfirmationButton::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
}
@@ -432,7 +430,7 @@ void SyncStatusHandler::reportWarning(const std::wstring& warningMessage, bool&
{
case ON_GUIERROR_POPUP:
{
- if (!progressDlg) abortThisProcess();
+ if (!progressDlg) abortProcessNow();
PauseTimers dummy(*progressDlg);
forceUiRefresh();
@@ -446,7 +444,7 @@ void SyncStatusHandler::reportWarning(const std::wstring& warningMessage, bool&
warningActive = !dontWarnAgain;
break;
case ConfirmationButton::CANCEL:
- abortThisProcess();
+ abortProcessNow();
break;
}
}
@@ -465,7 +463,7 @@ void SyncStatusHandler::forceUiRefresh()
}
-void SyncStatusHandler::abortThisProcess()
+void SyncStatusHandler::abortProcessNow()
{
requestAbortion(); //just make sure...
throw GuiAbortProcess(); //abort can be triggered by progressDlg
diff --git a/ui/gui_status_handler.h b/FreeFileSync/Source/ui/gui_status_handler.h
index fbbf827f..5f5e0817 100644
--- a/ui/gui_status_handler.h
+++ b/FreeFileSync/Source/ui/gui_status_handler.h
@@ -9,7 +9,7 @@
#include <wx/event.h>
#include <zen/error_log.h>
-#include <wx/stopwatch.h>
+//#include <wx/stopwatch.h>
#include "progress_indicator.h"
#include "../lib/status_handler.h"
#include "../lib/process_xml.h"
@@ -35,10 +35,11 @@ public:
virtual void reportFatalError(const std::wstring& errorMessage);
virtual void reportWarning(const std::wstring& warningMessage, bool& warningActive);
+ virtual void abortProcessNow(); //throw GuiAbortProcess
+
private:
void OnKeyPressed(wxKeyEvent& event);
void OnAbortCompare(wxCommandEvent& event); //handle abort button click
- virtual void abortThisProcess(); //throw GuiAbortProcess
MainDialog& mainDlg;
bool ignoreErrors;
@@ -68,8 +69,9 @@ public:
virtual void reportFatalError(const std::wstring& errorMessage);
virtual void reportWarning(const std::wstring& warningMessage, bool& warningActive);
+ virtual void abortProcessNow(); //throw GuiAbortProcess
+
private:
- virtual void abortThisProcess(); //throw GuiAbortProcess
void onProgressDialogTerminate();
SyncProgressDialog* progressDlg; //managed to have shorter lifetime than this handler!
@@ -79,7 +81,7 @@ private:
const size_t automaticRetryCount_;
const size_t automaticRetryDelay_;
const std::wstring jobName_;
- wxStopWatch totalTime;
+ const int64_t startTime_; //don't use wxStopWatch: may overflow after a few days due to ::QueryPerformanceCounter()
};
diff --git a/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp
index 8ca9cc0b..2e78152e 100644
--- a/ui/main_dlg.cpp
+++ b/FreeFileSync/Source/ui/main_dlg.cpp
@@ -99,15 +99,20 @@ public:
if (std::any_of(droppedFiles.begin(), droppedFiles.end(), [](const wxString& filename)
{
using namespace xmlAccess;
- switch (getXmlType(utfCvrtTo<Zstring>(filename))) //throw()
- {
- case XML_TYPE_GUI:
- case XML_TYPE_BATCH:
- return true;
- case XML_TYPE_GLOBAL:
- case XML_TYPE_OTHER:
- break;
+ try
+ {
+ switch (getXmlType(utfCvrtTo<Zstring>(filename))) //throw FfsXmlError
+ {
+ case XML_TYPE_GUI:
+ case XML_TYPE_BATCH:
+ return true;
+ case XML_TYPE_GLOBAL:
+ case XML_TYPE_OTHER:
+ break;
+ }
}
+ catch (const FfsXmlError&) {}
+
return false;
}))
{
@@ -314,6 +319,28 @@ void setMenuItemImage(wxMenuItem*& menuItem, const wxBitmap& bmp)
}
}
+
+void updateTopButton(wxBitmapButton& btn, const wxBitmap& bmp, const wxString& variantName, bool makeGrey)
+{
+ wxImage labelImage = createImageFromText(btn.GetLabel(), btn.GetFont(), wxSystemSettings::GetColour(makeGrey ? wxSYS_COLOUR_GRAYTEXT : wxSYS_COLOUR_BTNTEXT));
+ wxImage variantImage = createImageFromText(variantName, wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxBOLD), wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
+ wxImage descrImage = stackImages(labelImage, variantImage, ImageStackLayout::VERTICAL, ImageStackAlignment::CENTER);
+ const wxImage& iconImage = makeGrey ? greyScale(bmp.ConvertToImage()) : bmp.ConvertToImage();
+
+ wxImage dynImage = btn.GetLayoutDirection() != wxLayout_RightToLeft ?
+ stackImages(iconImage, descrImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5) :
+ stackImages(descrImage, iconImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5);
+
+ //SetMinSize() instead of SetSize() is needed here for wxWindows layout determination to work corretly
+ wxSize minSize = dynImage.GetSize() + wxSize(10, 10); //add border space
+ minSize.x = std::max(minSize.x, 180);
+
+ btn.SetMinSize(minSize);
+ btn.SetBitmapLabel(wxBitmap(dynImage));
+ //SetLabel() calls confuse wxBitmapButton in the disabled state and it won't show the image! workaround:
+ btn.SetBitmapDisabled(wxBitmap(dynImage.ConvertToDisabled()));
+}
+
//##################################################################################################################################
xmlAccess::XmlGlobalSettings retrieveGlobalCfgFromDisk() //blocks on GUI on errors!
@@ -328,9 +355,9 @@ xmlAccess::XmlGlobalSettings retrieveGlobalCfgFromDisk() //blocks on GUI on erro
}
catch (const FfsXmlError& e)
{
- assert(false);
if (e.getSeverity() != FfsXmlError::WARNING) //ignore parsing errors: should be migration problems only *cross-fingers*
showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); //no parent window: main dialog not yet created!
+ assert(false);
}
return globalCfg;
}
@@ -479,6 +506,10 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg,
auiMgr.AddPane(m_panelConfig,
wxAuiPaneInfo().Name(L"Panel4").Layer(3).Left().Position(2).Caption(_("Configuration")).MinSize(m_listBoxHistory->GetSize().GetWidth(), m_panelConfig->GetSize().GetHeight()));
+ //set comparison button label tentatively for m_panelTopButtons to receive final height:
+ updateTopButton(*m_buttonCompare, getResourceImage(L"compare"), L"Dummy", false);
+ m_panelTopButtons->GetSizer()->SetSizeHints(m_panelTopButtons); //~=Fit() + SetMinSize()
+
auiMgr.AddPane(m_panelTopButtons,
wxAuiPaneInfo().Name(L"Panel1").Layer(4).Top().Row(1).Caption(_("Main Bar")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(-1, m_panelTopButtons->GetSize().GetHeight()));
//note: min height is calculated incorrectly by wxAuiManager if panes with and without caption are in the same row => use smaller min-size
@@ -589,11 +620,11 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg,
}
//menu icons: workaround for wxWidgets: small hack to update menu items: actually this is a wxWidgets bug (affects Windows- and Linux-build)
- setMenuItemImage(m_menuItem10, getResourceImage(L"compare_small"));
- setMenuItemImage(m_menuItem11, getResourceImage(L"sync_small"));
+ setMenuItemImage(m_menuItem10, getResourceImage(L"compare_small"));
+ setMenuItemImage(m_menuItem11, getResourceImage(L"sync_small"));
- setMenuItemImage(m_menuItemLoad, getResourceImage(L"load_small"));
- setMenuItemImage(m_menuItemSave, getResourceImage(L"save_small"));
+ setMenuItemImage(m_menuItemLoad, getResourceImage(L"load_small"));
+ setMenuItemImage(m_menuItemSave, getResourceImage(L"save_small"));
setMenuItemImage(m_menuItemGlobSett, getResourceImage(L"settings_small"));
setMenuItemImage(m_menuItem7, getResourceImage(L"batch_small"));
@@ -614,8 +645,7 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg,
}
//create language selection menu
- std::for_each(zen::ExistingTranslations::get().begin(), ExistingTranslations::get().end(),
- [&](const ExistingTranslations::Entry& entry)
+ for (const ExistingTranslations::Entry& entry : ExistingTranslations::get())
{
wxMenuItem* newItem = new wxMenuItem(m_menuLanguages, wxID_ANY, entry.languageName);
newItem->SetBitmap(getResourceImage(entry.languageFlag));
@@ -626,7 +656,7 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg,
//connect event
this->Connect(newItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnMenuLanguageSwitch));
m_menuLanguages->Append(newItem);
- });
+ }
//notify about (logical) application main window => program won't quit, but stay on this dialog
zen::setMainWindow(this);
@@ -709,8 +739,8 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg,
auto addDirCheck = [&](const FolderPairEnh& fp)
{
- const Zstring dirLeft = getFormattedDirectoryName(fp.leftDirectory ); //should not block!?
- const Zstring dirRight = getFormattedDirectoryName(fp.rightDirectory); //
+ const Zstring dirLeft = getFormattedDirectoryName(fp.dirnamePhraseLeft ); //should not block!?
+ const Zstring dirRight = getFormattedDirectoryName(fp.dirnamePhraseRight); //
if (dirLeft.empty() != dirRight.empty()) //only skip check if both sides are empty!
havePartialPair = true;
@@ -1020,8 +1050,8 @@ void MainDialog::copySelectionToClipboard(const std::vector<const Grid*>& gridRe
}
};
- for (auto it = gridRefs.begin(); it != gridRefs.end(); ++it)
- addSelection(**it);
+ for (const Grid* gr : gridRefs)
+ addSelection(*gr);
//finally write to clipboard
if (!clipboardString.empty())
@@ -1184,7 +1214,7 @@ private:
//context: C callstack message loop => throw()!
void OnAbortDeletion(wxCommandEvent& event) //handle abort button click
{
- abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw zen::AbortThisProcess())
+ abortRequested = true; //don't throw exceptions across a C call stack!
}
void OnKeyPressed(wxKeyEvent& event)
@@ -1192,7 +1222,7 @@ private:
const int keyCode = event.GetKeyCode();
if (keyCode == WXK_ESCAPE)
{
- abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw zen::AbortThisProcess())
+ abortRequested = true; //don't throw exceptions across a C call stack!
return;
}
@@ -1244,15 +1274,16 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec
statusHandler,
globalCfg.optDialogs.warningRecyclerMissing);
- gridview::clearSelection(*m_gridMainL, *m_gridMainC, *m_gridMainR); //do not clear, if aborted!
+ m_gridMainL->clearSelection(ALLOW_GRID_EVENT);
+ m_gridMainC->clearSelection(ALLOW_GRID_EVENT);
+ m_gridMainR->clearSelection(ALLOW_GRID_EVENT);
}
- catch (AbortDeleteProcess&) {}
+ catch (AbortDeleteProcess&) {} //do not clear grids, if aborted!
//remove rows that are empty: just a beautification, invalid rows shouldn't cause issues
gridDataView->removeInvalidRows();
- //redraw grid neccessary to update new dimensions and for UI-Backend data linkage
- updateGui(); //call immediately after deleteFromGridAndHD!!!
+ updateGui();
}
}
}
@@ -1796,6 +1827,7 @@ void MainDialog::onGridButtonEvent(wxKeyEvent& event, Grid& grid, bool leftSide)
}
+//pretty much the same like "bool wxWindowBase::IsDescendant(wxWindowBase* child) const" but without the obvious misnaming
bool isComponentOf(const wxWindow* child, const wxWindow* top)
{
for (const wxWindow* wnd = child; wnd != nullptr; wnd = wnd->GetParent())
@@ -1807,20 +1839,19 @@ bool isComponentOf(const wxWindow* child, const wxWindow* top)
void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events without explicit menu entry :)
{
+ const wxWindow* focus = wxWindow::FindFocus();
+
//avoid recursion!!! -> this ugly construct seems to be the only (portable) way to avoid re-entrancy
- //recursion may happen in multiple situations: e.g. modal dialogs, wxGrid::ProcessEvent()!
+ //recursion may happen in multiple situations: e.g. modal dialogs, Grid::ProcessEvent()!
if (processingGlobalKeyEvent ||
- !IsShown() ||
- !IsActive() ||
- !IsEnabled() ||
- !m_gridMainL->IsEnabled() || //
- !m_gridMainC->IsEnabled() || //only handle if main window is in use
- !m_gridMainR->IsEnabled()) //
+ !isComponentOf(focus, this) ||
+ !IsEnabled() || //only handle if main window is in use and no modal dialog is shown:
+ !IsActive()) //thanks to wxWidgets non-portability we need both checks:
+ //first is sufficient for Windows, second is needed on OS X since it does NOT disable the parent when showing a modal dialog
{
event.Skip();
return;
}
-
processingGlobalKeyEvent = true;
ZEN_ON_SCOPE_EXIT(processingGlobalKeyEvent = false;)
//----------------------------------------------------
@@ -1889,8 +1920,6 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou
case WXK_NUMPAD_PAGEDOWN:
case WXK_NUMPAD_HOME:
case WXK_NUMPAD_END:
- {
- const wxWindow* focus = wxWindow::FindFocus();
if (!isComponentOf(focus, m_gridMainL ) && //
!isComponentOf(focus, m_gridMainC ) && //don't propagate keyboard commands if grid is already in focus
!isComponentOf(focus, m_gridMainR ) && //
@@ -1899,7 +1928,8 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou
!isComponentOf(focus, m_directoryLeft ) && //don't propagate if changing directory field
!isComponentOf(focus, m_directoryRight) &&
!isComponentOf(focus, m_panelSearch ) &&
- !isComponentOf(focus, m_scrolledWindowFolderPairs))
+ !isComponentOf(focus, m_scrolledWindowFolderPairs) &&
+ m_gridMainL->IsEnabled())
if (wxEvtHandler* evtHandler = m_gridMainL->getMainWin().GetEventHandler())
{
m_gridMainL->SetFocus();
@@ -1909,8 +1939,7 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou
event.Skip(false); //definitively handled now!
return;
}
- }
- break;
+ break;
}
event.Skip();
@@ -1921,7 +1950,7 @@ void MainDialog::onNaviSelection(GridRangeSelectEvent& event)
{
//scroll m_gridMain to user's new selection on m_gridNavi
ptrdiff_t leadRow = -1;
- if (event.rowFirst_ != event.rowLast_)
+ if (event.positive_ && event.rowFirst_ != event.rowLast_)
if (std::unique_ptr<TreeView::Node> node = treeDataView->getLine(event.rowFirst_))
{
if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
@@ -2406,30 +2435,30 @@ void MainDialog::OnContextSetLayout(wxMouseEvent& event)
updateGuiForFolderPair();
});
//----------------------------------------------------------------------------------------
- std::vector<std::pair<wxString, wxString>> captionNameMap; //(caption, identifier)
+
+ bool addedSeperator = false;
const wxAuiPaneInfoArray& paneArray = auiMgr.GetAllPanes();
for (size_t i = 0; i < paneArray.size(); ++i)
- if (!paneArray[i].IsShown() && !paneArray[i].name.empty() &&
- paneArray[i].window != compareStatus->getAsWindow() &&
- paneArray[i].window != m_panelSearch)
- captionNameMap.push_back(std::make_pair(paneArray[i].caption, paneArray[i].name));
-
- if (!captionNameMap.empty())
- menu.addSeparator();
-
- auto showPanel = [&](const wxString& identifier)
{
- auiMgr.GetPane(identifier).Show();
- auiMgr.Update();
- };
-
- for (auto it = captionNameMap.begin(); it != captionNameMap.end(); ++it)
- {
- const wxString label = replaceCpy(_("Show \"%x\""), L"%x", it->first);
- const wxString identifier = it->second;
+ wxAuiPaneInfo& paneInfo = paneArray[i];
+ if (!paneInfo.IsShown() &&
+ paneInfo.window != compareStatus->getAsWindow() &&
+ paneInfo.window != m_panelSearch)
+ {
+ if (!addedSeperator)
+ {
+ menu.addSeparator();
+ addedSeperator = true;
+ }
- menu.addItem(label, [showPanel, identifier] { showPanel(identifier); });
+ menu.addItem(replaceCpy(_("Show \"%x\""), L"%x", paneInfo.caption),
+ [this, &paneInfo]
+ {
+ paneInfo.Show();
+ this->auiMgr.Update();
+ });
+ }
}
menu.popup(*this);
@@ -2513,15 +2542,14 @@ void MainDialog::addFileToCfgHistory(const std::vector<Zstring>& filenames)
int lastUseIndexMax = 0;
for (unsigned int i = 0; i < m_listBoxHistory->GetCount(); ++i)
if (auto histData = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(i)))
- if (histData->lastUseIndex_ > lastUseIndexMax)
- lastUseIndexMax = histData->lastUseIndex_;
+ lastUseIndexMax = std::max(lastUseIndexMax, histData->lastUseIndex_);
+ else
+ assert(false);
std::deque<bool> selections(m_listBoxHistory->GetCount()); //items to select after update of history list
- for (auto it = filenames.begin(); it != filenames.end(); ++it)
+ for (const Zstring& filename : filenames)
{
- const Zstring& filename = *it;
-
//Do we need to additionally check for aliases of the same physical files here? (and aliases for lastRunConfigName?)
const auto itemPos = [&]() -> std::pair<wxClientHistoryData*, unsigned int>
@@ -2553,7 +2581,7 @@ void MainDialog::addFileToCfgHistory(const std::vector<Zstring>& filenames)
{
//workaround wxWidgets 2.9 bug on GTK screwing up the client data if the list box is sorted:
label = getFormattedHistoryElement(filename);
- //"linear insertion sort":
+ //"linear-time insertion sort":
for (; newPos < m_listBoxHistory->GetCount(); ++newPos)
if (label.CmpNoCase(m_listBoxHistory->GetString(newPos)) < 0)
break;
@@ -2587,11 +2615,8 @@ void MainDialog::removeObsoleteCfgHistoryItems(const std::vector<Zstring>& filen
//check existence of all config files in parallel!
std::list<boost::unique_future<bool>> fileEx;
- for (auto it = filenames.begin(); it != filenames.end(); ++it) //avoid VC11 compiler issues with std::for_each
- {
- const Zstring filename = *it; //don't reference iterator in lambda!
+ for (const Zstring& filename : filenames)
fileEx.push_back(zen::async2<bool>([=] { return fileExists(filename); }));
- }
//potentially slow network access => limit maximum wait time!
wait_for_all_timed(fileEx.begin(), fileEx.end(), boost::posix_time::milliseconds(1000));
@@ -2628,7 +2653,7 @@ void MainDialog::removeCfgHistoryItems(const std::vector<Zstring>& filenames)
void MainDialog::updateUnsavedCfgStatus()
{
- const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : Zstring();
+ const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && !EqualFilename()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstring();
const bool haveUnsavedCfg = lastConfigurationSaved != getConfig();
@@ -2670,30 +2695,36 @@ void MainDialog::updateUnsavedCfgStatus()
void MainDialog::OnConfigSave(wxCommandEvent& event)
{
- const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : Zstring();
+ const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && !EqualFilename()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstring();
+
+ using namespace xmlAccess;
//if we work on a single named configuration document: save directly if changed
//else: always show file dialog
- if (!activeCfgFilename.empty())
- {
- using namespace xmlAccess;
-
- switch (getXmlType(activeCfgFilename)) //throw()
+ if (activeCfgFilename.empty())
+ trySaveConfig(nullptr);
+ else
+ try
{
- case XML_TYPE_GUI:
- trySaveConfig(&activeCfgFilename);
- return;
- case XML_TYPE_BATCH:
- trySaveBatchConfig(&activeCfgFilename);
- return;
- case XML_TYPE_GLOBAL:
- case XML_TYPE_OTHER:
- assert(false);
- return;
+ switch (getXmlType(activeCfgFilename)) //throw FfsXmlError
+ {
+ case XML_TYPE_GUI:
+ trySaveConfig(&activeCfgFilename);
+ break;
+ case XML_TYPE_BATCH:
+ trySaveBatchConfig(&activeCfgFilename);
+ break;
+ case XML_TYPE_GLOBAL:
+ case XML_TYPE_OTHER:
+ showNotificationDialog(this, DialogInfoType::ERROR2,
+ PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(activeCfgFilename))));
+ break;
+ }
+ }
+ catch (const FfsXmlError& e)
+ {
+ showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString()));
}
- }
-
- trySaveConfig(nullptr);
}
@@ -2720,7 +2751,7 @@ bool MainDialog::trySaveConfig(const Zstring* fileNameGui) //return true if save
}
else
{
- Zstring defaultFileName = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : Zstr("SyncSettings.ffs_gui");
+ Zstring defaultFileName = activeConfigFiles.size() == 1 && !EqualFilename()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstr("SyncSettings.ffs_gui");
//attention: activeConfigFiles may be an imported *.ffs_batch file! We don't want to overwrite it with a GUI config!
if (endsWith(defaultFileName, Zstr(".ffs_batch")))
replace(defaultFileName, Zstr(".ffs_batch"), Zstr(".ffs_gui"), false);
@@ -2772,7 +2803,7 @@ bool MainDialog::trySaveBatchConfig(const Zstring* fileNameBatch)
}
else
{
- const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : Zstring();
+ const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && !EqualFilename()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstring();
batchCfg = convertGuiToBatchPreservingExistingBatch(guiCfg, activeCfgFilename);
//let user change batch config: this should change batch-exclusive settings only, else the "setLastUsedConfig" below would be somewhat of a lie
@@ -2819,7 +2850,7 @@ bool MainDialog::saveOldConfig() //return false on user abort
{
if (lastConfigurationSaved != getConfig())
{
- const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : Zstring();
+ const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && !EqualFilename()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstring();
//notify user about changed settings
if (globalCfg.optDialogs.popupOnConfigChange)
@@ -2835,16 +2866,26 @@ bool MainDialog::saveOldConfig() //return false on user abort
{
case ConfirmationButton3::DO_IT: //save
using namespace xmlAccess;
- switch (getXmlType(activeCfgFilename)) //throw()
+
+ try
+ {
+ switch (getXmlType(activeCfgFilename)) //throw FfsXmlError
+ {
+ case XML_TYPE_GUI:
+ return trySaveConfig(&activeCfgFilename);
+ case XML_TYPE_BATCH:
+ return trySaveBatchConfig(&activeCfgFilename);
+ case XML_TYPE_GLOBAL:
+ case XML_TYPE_OTHER:
+ showNotificationDialog(this, DialogInfoType::ERROR2,
+ PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(activeCfgFilename))));
+ return false;
+ }
+ }
+ catch (const FfsXmlError& e)
{
- case XML_TYPE_GUI:
- return trySaveConfig(&activeCfgFilename);
- case XML_TYPE_BATCH:
- return trySaveBatchConfig(&activeCfgFilename);
- case XML_TYPE_GLOBAL:
- case XML_TYPE_OTHER:
- assert(false);
- return false;
+ showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString()));
+ return false;
}
break;
@@ -2868,7 +2909,7 @@ bool MainDialog::saveOldConfig() //return false on user abort
void MainDialog::OnConfigLoad(wxCommandEvent& event)
{
- const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : Zstring();
+ const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && !EqualFilename()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstring();
wxFileDialog filePicker(this,
wxEmptyString,
@@ -2969,7 +3010,7 @@ bool MainDialog::loadConfiguration(const std::vector<Zstring>& filenames)
return false; //cancelled by user
//load XML
- xmlAccess::XmlGuiConfig newGuiCfg; //structure to receive gui settings, already defaulted!!
+ xmlAccess::XmlGuiConfig newGuiCfg; //structure to receive gui settings, already defaulted!!
try
{
//allow reading batch configurations also
@@ -2993,6 +3034,7 @@ bool MainDialog::loadConfiguration(const std::vector<Zstring>& filenames)
}
}
+
void MainDialog::deleteSelectedCfgHistoryItems()
{
wxArrayInt tmp;
@@ -3118,8 +3160,8 @@ void MainDialog::setConfig(const xmlAccess::XmlGuiConfig& newGuiCfg, const std::
updateGlobalFilterButton();
//set first folder pair
- firstFolderPair->setValues(currentCfg.mainCfg.firstPair.leftDirectory,
- currentCfg.mainCfg.firstPair.rightDirectory,
+ firstFolderPair->setValues(currentCfg.mainCfg.firstPair.dirnamePhraseLeft,
+ currentCfg.mainCfg.firstPair.dirnamePhraseRight,
currentCfg.mainCfg.firstPair.altCmpConfig,
currentCfg.mainCfg.firstPair.altSyncConfig,
currentCfg.mainCfg.firstPair.localFilter);
@@ -3447,8 +3489,11 @@ void MainDialog::OnCompare(wxCommandEvent& event)
// if (m_buttonSync->IsShownOnScreen()) m_buttonSync->SetFocus();
- gridview::clearSelection(*m_gridMainL, *m_gridMainC, *m_gridMainR);
- m_gridNavi->clearSelection();
+ m_gridMainL->clearSelection(ALLOW_GRID_EVENT);
+ m_gridMainC->clearSelection(ALLOW_GRID_EVENT);
+ m_gridMainR->clearSelection(ALLOW_GRID_EVENT);
+
+ m_gridNavi->clearSelection(ALLOW_GRID_EVENT);
//play (optional) sound notification after sync has completed (GUI and batch mode)
//const Zstring soundFile = zen::getResourceDir() + Zstr("Compare_Complete.wav");
@@ -3467,30 +3512,8 @@ void MainDialog::OnCompare(wxCommandEvent& event)
void MainDialog::updateTopButtonImages()
{
- auto updateButton = [&](wxBitmapButton& btn, const wxBitmap& bmp, const wxString& variantName, bool makeGrey)
- {
- wxImage labelImage = createImageFromText(btn.GetLabel(), btn.GetFont(), wxSystemSettings::GetColour(makeGrey ? wxSYS_COLOUR_GRAYTEXT : wxSYS_COLOUR_BTNTEXT));
- wxImage variantImage = createImageFromText(variantName, wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxBOLD), wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
-
- wxImage descrImage = stackImages(labelImage, variantImage, ImageStackLayout::VERTICAL, ImageStackAlignment::CENTER);
- const wxImage& iconImage = makeGrey ? greyScale(bmp.ConvertToImage()) : bmp.ConvertToImage();
-
- wxImage dynImage = btn.GetLayoutDirection() != wxLayout_RightToLeft ?
- stackImages(iconImage, descrImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5) :
- stackImages(descrImage, iconImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5);
-
- //SetMinSize() instead of SetSize() is needed here for wxWindows layout determination to work corretly
- wxSize minSize = dynImage.GetSize() + wxSize(10, 10); //add border space
- minSize.x = std::max(minSize.x, 180);
- btn.SetMinSize(minSize);
-
- btn.SetBitmapLabel(wxBitmap(dynImage));
- //SetLabel() calls confuse wxBitmapButton in the disabled state and it won't show the image! workaround:
- btn.SetBitmapDisabled(wxBitmap(dynImage.ConvertToDisabled()));
- };
-
- updateButton(*m_buttonCompare, getResourceImage(L"compare"), getConfig().mainCfg.getCompVariantName(), false);
- updateButton(*m_buttonSync, getResourceImage(L"sync"), getConfig().mainCfg.getSyncVariantName(), folderCmp.empty());
+ updateTopButton(*m_buttonCompare, getResourceImage(L"compare"), getConfig().mainCfg.getCompVariantName(), false);
+ updateTopButton(*m_buttonSync, getResourceImage(L"sync"), getConfig().mainCfg.getSyncVariantName(), folderCmp.empty());
m_panelTopButtons->Layout();
}
@@ -3639,7 +3662,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
try
{
//PERF_START;
- const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : Zstring();
+ const Zstring activeCfgFilename = activeConfigFiles.size() == 1 && !EqualFilename()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstring();
const auto& guiCfg = getConfig();
@@ -3734,7 +3757,10 @@ void MainDialog::onGridLabelLeftClick(bool onLeft, ColumnTypeRim type)
gridDataView->sortView(type, onLeft, sortAscending);
- gridview::clearSelection(*m_gridMainL, *m_gridMainC, *m_gridMainR);
+ m_gridMainL->clearSelection(ALLOW_GRID_EVENT);
+ m_gridMainC->clearSelection(ALLOW_GRID_EVENT);
+ m_gridMainR->clearSelection(ALLOW_GRID_EVENT);
+
updateGui(); //refresh gridDataView
}
@@ -3765,15 +3791,12 @@ void MainDialog::OnSwapSides(wxCommandEvent& event)
firstFolderPair->getAltFilterConfig());
//additional pairs
- for (auto it = additionalFolderPairs.begin(); it != additionalFolderPairs.end(); ++it)
- {
- FolderPairPanel* panel = *it;
+ for (FolderPairPanel* panel : additionalFolderPairs)
panel->setValues(panel->getRightDir(), // swap directories
panel->getLeftDir(), //
panel->getAltCompConfig(),
panel->getAltSyncConfig(),
panel->getAltFilterConfig());
- }
//swap view filter
bool tmp = m_bpButtonShowLeftOnly->isActive();
@@ -4103,8 +4126,8 @@ void MainDialog::OnAddFolderPair(wxCommandEvent& event)
//clear first pair
const FolderPairEnh cfgEmpty;
- firstFolderPair->setValues(cfgEmpty.leftDirectory,
- cfgEmpty.rightDirectory,
+ firstFolderPair->setValues(cfgEmpty.dirnamePhraseLeft,
+ cfgEmpty.dirnamePhraseRight,
cfgEmpty.altCmpConfig,
cfgEmpty.altSyncConfig,
cfgEmpty.localFilter);
@@ -4126,8 +4149,8 @@ void MainDialog::OnRemoveTopFolderPair(wxCommandEvent& event)
const FolderPairEnh cfgSecond = getEnhancedPair(additionalFolderPairs[0]);
//reset first pair
- firstFolderPair->setValues(cfgSecond.leftDirectory,
- cfgSecond.rightDirectory,
+ firstFolderPair->setValues(cfgSecond.dirnamePhraseLeft,
+ cfgSecond.dirnamePhraseRight,
cfgSecond.altCmpConfig,
cfgSecond.altSyncConfig,
cfgSecond.localFilter);
@@ -4255,8 +4278,8 @@ void MainDialog::addAddFolderPair(const std::vector<FolderPairEnh>& newPairs, bo
//wxComboBox screws up miserably if width/height is smaller than the magic number 4! Problem occurs when trying to set tooltip
//so we have to update window sizes before setting configuration:
for (auto it = newPairs.begin(); it != newPairs.end(); ++it)//set alternate configuration
- newEntries[it - newPairs.begin()]->setValues(it->leftDirectory,
- it->rightDirectory,
+ newEntries[it - newPairs.begin()]->setValues(it->dirnamePhraseLeft,
+ it->dirnamePhraseRight,
it->altCmpConfig,
it->altSyncConfig,
it->localFilter);
diff --git a/ui/main_dlg.h b/FreeFileSync/Source/ui/main_dlg.h
index 110f42b6..110f42b6 100644
--- a/ui/main_dlg.h
+++ b/FreeFileSync/Source/ui/main_dlg.h
diff --git a/ui/osx_dock.h b/FreeFileSync/Source/ui/osx_dock.h
index 62237524..62237524 100644
--- a/ui/osx_dock.h
+++ b/FreeFileSync/Source/ui/osx_dock.h
diff --git a/ui/osx_dock.mm b/FreeFileSync/Source/ui/osx_dock.mm
index 8f42ae88..8f42ae88 100644
--- a/ui/osx_dock.mm
+++ b/FreeFileSync/Source/ui/osx_dock.mm
diff --git a/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp
index efbb62f0..cec13836 100644
--- a/ui/progress_indicator.cpp
+++ b/FreeFileSync/Source/ui/progress_indicator.cpp
@@ -7,7 +7,8 @@
#include "progress_indicator.h"
#include <memory>
#include <wx/imaglist.h>
-#include <wx/stopwatch.h>
+//#include <wx/stopwatch.h>
+//#include <wx/time.h>
#include <wx/wupdlock.h>
#include <wx/sound.h>
#include <wx/clipbrd.h>
@@ -50,6 +51,46 @@ const int GAUGE_FULL_RANGE = 50000;
//window size used for statistics in milliseconds
const int WINDOW_REMAINING_TIME = 60000; //some scenarios have dropouts of 40 seconds -> 60 sec. window size handles them well
const int WINDOW_BYTES_PER_SEC = 5000; //
+
+//don't use wxStopWatch for long-running measurements: internally it uses ::QueryPerformanceCounter() which can overflow after only a few days:
+//https://sourceforge.net/p/freefilesync/discussion/help/thread/5d62339e
+
+class StopWatch
+{
+public:
+ StopWatch() : startTime(wxGetUTCTimeMillis().GetValue()), paused(false), elapsedUntilPause(0) {} //start running
+
+ void restart()
+ {
+ startTime = wxGetUTCTimeMillis().GetValue(); //uses ::GetSystemTimeAsFileTime()
+ paused = false;
+ }
+
+ void pause()
+ {
+ if (!paused)
+ {
+ paused = true;
+ elapsedUntilPause = wxGetUTCTimeMillis().GetValue() - startTime;
+ }
+ }
+
+ void resume()
+ {
+ if (paused)
+ {
+ paused = false;
+ startTime = wxGetUTCTimeMillis().GetValue() - elapsedUntilPause;
+ }
+ }
+
+ int64_t timeMs() const { return paused ? elapsedUntilPause : wxGetUTCTimeMillis().GetValue() - startTime; }
+
+private:
+ int64_t startTime;
+ bool paused;
+ int64_t elapsedUntilPause;
+};
}
@@ -68,15 +109,15 @@ private:
wxFrame& parentWindow_;
wxString titleTextBackup;
- wxStopWatch timeElapsed;
- long binCompStartMs; //begin of binary comparison phase in [ms]
+ StopWatch timeElapsed;
+ int64_t binCompStartMs; //begin of binary comparison phase in [ms]
const Statistics* syncStat_; //only bound while sync is running
std::unique_ptr<Taskbar> taskbar_;
std::unique_ptr<PerfCheck> perf; //estimate remaining time
- long lastStatCallSpeed; //used for calculating intervals between showing and collecting perf samples
+ int64_t lastStatCallSpeed; //used for calculating intervals between showing and collecting perf samples
};
@@ -107,7 +148,7 @@ void CompareProgressDialog::Pimpl::init(const Statistics& syncStat)
m_gauge2->SetValue(0);
perf.reset();
- timeElapsed.Start(); //measure total time
+ timeElapsed.restart(); //measure total time
//initially hide status that's relevant for comparing bytewise only
bSizerFilesFound ->Show(true);
@@ -137,7 +178,7 @@ void CompareProgressDialog::Pimpl::switchToCompareBytewise()
perf = make_unique<PerfCheck>(WINDOW_REMAINING_TIME, WINDOW_BYTES_PER_SEC);
lastStatCallSpeed = -1000000; //some big number
- binCompStartMs = timeElapsed.Time();
+ binCompStartMs = timeElapsed.timeMs();
//show status for comparing bytewise
bSizerFilesFound ->Show(false);
@@ -165,7 +206,7 @@ void CompareProgressDialog::Pimpl::updateStatusPanelNow()
};
bool layoutChanged = false; //avoid screen flicker by calling layout() only if necessary
- const long timeNow = timeElapsed.Time();
+ const int64_t timeNow = timeElapsed.timeMs();
//status texts
setText(*m_textCtrlStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts!
@@ -237,7 +278,7 @@ void CompareProgressDialog::Pimpl::updateStatusPanelNow()
setText(*m_staticTextScanned, scannedObjects, &layoutChanged);
//time elapsed
- const long timeElapSec = timeNow / 1000;
+ const int64_t timeElapSec = timeNow / 1000;
setText(*m_staticTextTimeElapsed,
timeElapSec < 3600 ?
wxTimeSpan::Seconds(timeElapSec).Format( L"%M:%S") :
@@ -561,6 +602,22 @@ public:
private:
const std::shared_ptr<MessageView> msgView_;
};
+
+bool isComponentOf(const wxWindow* child, const wxWindow* top)
+{
+ for (const wxWindow* wnd = child; wnd != nullptr; wnd = wnd->GetParent())
+ if (wnd == top)
+ return true;
+ return false;
+}
+
+const wxTopLevelWindow* getTopLevelWindow(const wxWindow* child)
+{
+ for (const wxWindow* wnd = child; wnd != nullptr; wnd = wnd->GetParent())
+ if (auto tlw = dynamic_cast<const wxTopLevelWindow*>(wnd))
+ return tlw;
+ return nullptr;
+}
}
@@ -568,7 +625,8 @@ class LogPanel : public LogPanelGenerated
{
public:
LogPanel(wxWindow* parent, const ErrorLog& log) : LogPanelGenerated(parent),
- msgView(std::make_shared<MessageView>(log))
+ msgView(std::make_shared<MessageView>(log)),
+ processingGlobalKeyEvent(false)
{
const int errorCount = log.getItemCount(TYPE_ERROR | TYPE_FATAL_ERROR);
const int warningCount = log.getItemCount(TYPE_WARNING);
@@ -608,9 +666,19 @@ public:
m_gridMessages->Connect(EVENT_GRID_MOUSE_RIGHT_UP, GridClickEventHandler(LogPanel::onMsgGridContext), nullptr, this);
+ wxTheApp->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(LogPanel::onGlobalKeyEvent), nullptr, this);
+ wxTheApp->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(LogPanel::onGlobalKeyEvent), nullptr, this); //capture direction keys
+
updateGrid();
}
+ ~LogPanel()
+ {
+ //important! event source wxTheApp is NOT dependent on this instance -> disconnect!
+ wxTheApp->Disconnect(wxEVT_KEY_DOWN, wxKeyEventHandler(LogPanel::onGlobalKeyEvent), nullptr, this);
+ wxTheApp->Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(LogPanel::onGlobalKeyEvent), nullptr, this);
+ }
+
private:
virtual void OnErrors(wxCommandEvent& event)
{
@@ -653,6 +721,8 @@ private:
if (event.ControlDown())
switch (keyCode)
{
+ //case 'A': -> "select all" is already implemented by Grid!
+
case 'C':
case WXK_INSERT: //CTRL + C || CTRL + INS
copySelectionToClipboard();
@@ -666,11 +736,89 @@ private:
{
const std::vector<size_t> selection = m_gridMessages->getSelectedRows();
+ const size_t rowCount = [&]() -> size_t
+ {
+ if (auto prov = m_gridMessages->getDataProvider())
+ return prov->getRowCount();
+ return 0;
+ }();
+
ContextMenu menu;
+ menu.addItem(_("Select all") + L"\tCtrl+A", [this] { m_gridMessages->selectAllRows(ALLOW_GRID_EVENT); }, nullptr, rowCount > 0);
+ menu.addSeparator();
+
menu.addItem(_("Copy") + L"\tCtrl+C", [this] { copySelectionToClipboard(); }, nullptr, !selection.empty());
menu.popup(*this);
}
+ void onGlobalKeyEvent(wxKeyEvent& event) //process key events without explicit menu entry :)
+ {
+ const wxWindow* focus = wxWindow::FindFocus();
+ const wxTopLevelWindow* tlw = getTopLevelWindow(this);
+
+ //avoid recursion!!! -> this ugly construct seems to be the only (portable) way to avoid re-entrancy
+ //recursion may happen in multiple situations: e.g. modal dialogs, Grid::ProcessEvent()!
+ if (processingGlobalKeyEvent ||
+ !isComponentOf(focus, this) ||
+ !IsEnabled() || //only handle if main window is in use and no modal dialog is shown:
+ !tlw || !const_cast<wxTopLevelWindow*>(tlw)->IsActive()) //thanks to wxWidgets non-portability we need both checks:
+ //first is sufficient for Windows, second is needed on OS X since it does NOT disable the parent when showing a modal dialog
+ {
+ event.Skip();
+ return;
+ }
+ processingGlobalKeyEvent = true;
+ ZEN_ON_SCOPE_EXIT(processingGlobalKeyEvent = false;)
+ //----------------------------------------------------
+
+ const int keyCode = event.GetKeyCode();
+
+ if (event.ControlDown())
+ switch (keyCode)
+ {
+ case 'A':
+ m_gridMessages->SetFocus();
+ m_gridMessages->selectAllRows(ALLOW_GRID_EVENT);
+ return; // -> swallow event! don't allow default grid commands!
+ }
+ else
+ switch (keyCode)
+ {
+ //redirect certain (unhandled) keys directly to grid!
+ case WXK_UP:
+ case WXK_DOWN:
+ case WXK_LEFT:
+ case WXK_RIGHT:
+ case WXK_NUMPAD_UP:
+ case WXK_NUMPAD_DOWN:
+ case WXK_NUMPAD_LEFT:
+ case WXK_NUMPAD_RIGHT:
+
+ case WXK_PAGEUP:
+ case WXK_PAGEDOWN:
+ case WXK_HOME:
+ case WXK_END:
+ case WXK_NUMPAD_PAGEUP:
+ case WXK_NUMPAD_PAGEDOWN:
+ case WXK_NUMPAD_HOME:
+ case WXK_NUMPAD_END:
+ if (!isComponentOf(focus, m_gridMessages) && //don't propagate keyboard commands if grid is already in focus
+ m_gridMessages->IsEnabled())
+ if (wxEvtHandler* evtHandler = m_gridMessages->getMainWin().GetEventHandler())
+ {
+ m_gridMessages->SetFocus();
+
+ event.SetEventType(wxEVT_KEY_DOWN); //the grid event handler doesn't expect wxEVT_CHAR_HOOK!
+ evtHandler->ProcessEvent(event); //propagating event catched at wxTheApp to child leads to recursion, but we prevented it...
+ event.Skip(false); //definitively handled now!
+ return;
+ }
+ break;
+ }
+
+ event.Skip();
+ }
+
void copySelectionToClipboard()
{
try
@@ -683,14 +831,8 @@ private:
std::vector<Grid::ColumnAttribute> colAttr = m_gridMessages->getColumnConfig();
vector_remove_if(colAttr, [](const Grid::ColumnAttribute& ca) { return !ca.visible_; });
if (!colAttr.empty())
- {
- const std::vector<size_t> selection = m_gridMessages->getSelectedRows();
- std::for_each(selection.begin(), selection.end(),
- [&](size_t row)
+ for (size_t row : m_gridMessages->getSelectedRows())
{
-#ifdef _MSC_VER
- typedef zxString zxString; //workaround MSVC compiler bug!
-#endif
std::for_each(colAttr.begin(), --colAttr.end(),
[&](const Grid::ColumnAttribute& ca)
{
@@ -699,8 +841,7 @@ private:
});
clipboardString += copyStringTo<zxString>(prov->getValue(row, colAttr.back().type_));
clipboardString += L'\n';
- });
- }
+ }
}
//finally write to clipboard
@@ -718,6 +859,8 @@ private:
}
std::shared_ptr<MessageView> msgView; //bound!
+
+ bool processingGlobalKeyEvent;
};
//########################################################################################
@@ -731,7 +874,7 @@ public:
void clear() { samples.clear(); timeNow = 0; }
- void addRecord(long timeNowMs, double value)
+ void addRecord(int64_t timeNowMs, double value)
{
//samples.clear();
//samples.insert(std::make_pair(-1000, 0));
@@ -742,8 +885,8 @@ public:
timeNow = timeNowMs;
- //don't allow for more samples per second than there are UI updates (handles duplicate inserts, too!)
- if (!samples.empty() && timeNowMs / UI_UPDATE_INTERVAL == samples.rbegin()->first / UI_UPDATE_INTERVAL)
+ //allow for at most one sample per 100ms (handles duplicate inserts, too!) => this is unrelated to UI_UPDATE_INTERVAL!
+ if (!samples.empty() && timeNowMs / 100 == samples.rbegin()->first / 100)
{
samples.rbegin()->second = value;
return;
@@ -775,7 +918,7 @@ private:
virtual Opt<CurvePoint> getLessEq(double x) const override //x: seconds since begin
{
- const long timex = std::floor(x * 1000);
+ const int64_t timex = std::floor(x * 1000);
//------ add artifical last sample value -------
if (!samples.empty() && samples.rbegin()->first < timeNow)
if (timeNow <= timex)
@@ -793,7 +936,7 @@ private:
virtual Opt<CurvePoint> getGreaterEq(double x) const override
{
- const long timex = std::ceil(x * 1000);
+ const int64_t timex = std::ceil(x * 1000);
//------ add artifical last sample value -------
if (!samples.empty() && samples.rbegin()->first < timeNow)
if (samples.rbegin()->first < timex && timex <= timeNow)
@@ -808,8 +951,8 @@ private:
static const size_t MAX_BUFFER_SIZE = 2500000; //sizeof(single node) worst case ~ 3 * 8 byte ptr + 16 byte key/value = 40 byte
- std::map<long, double> samples; //time, unit: [ms] !don't use std::multimap, see getLessEq()
- long timeNow; //help create an artificial record at the end of samples to visualize current time!
+ std::map<int64_t, double> samples; //time, unit: [ms] !don't use std::multimap, see getLessEq()
+ int64_t timeNow; //help create an artificial record at the end of samples to visualize current time!
};
@@ -818,7 +961,7 @@ class CurveDataCurrentValue : public CurveData
public:
CurveDataCurrentValue() : x(0), yCurrent_(0), yTotal_(0) {}
- void setValue(long xTimeNowMs, double yCurrent, double yTotal) { x = xTimeNowMs / 1000.0; yCurrent_ = yCurrent; yTotal_ = yTotal; }
+ void setValue(int64_t xTimeNowMs, double yCurrent, double yTotal) { x = xTimeNowMs / 1000.0; yCurrent_ = yCurrent; yTotal_ = yTotal; }
private:
virtual std::pair<double, double> getRangeX() const override { return std::make_pair(x, x); } //conceptually just a vertical line!
@@ -852,7 +995,7 @@ class CurveDataTotalValue : public CurveData
public:
CurveDataTotalValue () : x(0), yTotal_(0) {}
- void setValue(long xTimeNowMs, double yTotal) { x = xTimeNowMs / 1000.0; yTotal_ = yTotal; }
+ void setValue(int64_t xTimeNowMs, double yTotal) { x = xTimeNowMs / 1000.0; yTotal_ = yTotal; }
private:
virtual std::pair<double, double> getRangeX() const override { return std::make_pair(x, x); } //conceptually just a vertical line!
@@ -990,12 +1133,12 @@ public:
virtual void stopTimer() //halt all internal counters!
{
pnl.m_animCtrlSyncing->Stop();
- timeElapsed.Pause ();
+ timeElapsed.pause();
}
virtual void resumeTimer()
{
pnl.m_animCtrlSyncing->Play();
- timeElapsed.Resume();
+ timeElapsed.resume();
}
private:
@@ -1018,7 +1161,7 @@ private:
SyncProgressPanelGenerated& pnl; //wxPanel containing the GUI controls of *this
const wxString jobName_;
- wxStopWatch timeElapsed;
+ StopWatch timeElapsed;
wxFrame* parentFrame_; //optional
@@ -1034,9 +1177,9 @@ private:
//remaining time
std::unique_ptr<PerfCheck> perf;
- long lastStatCallSpeed; //used for calculating intervals between collecting perf samples
+ int64_t lastStatCallSpeed; //used for calculating intervals between collecting perf samples
//help calculate total speed
- long phaseStartMs; //begin of current phase in [ms]
+ int64_t phaseStartMs; //begin of current phase in [ms]
std::shared_ptr<CurveDataStatistics> curveDataBytes;
std::shared_ptr<CurveDataStatistics> curveDataItems;
@@ -1114,7 +1257,7 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF
this->EnableCloseButton(false); //this is NOT honored on OS X or during system shutdown on Windows!
- timeElapsed.Start(); //measure total time
+ timeElapsed.restart(); //measure total time
if (wxFrame* frame = getTaskbarFrame(*this))
try //try to get access to Windows 7/Ubuntu taskbar
@@ -1182,8 +1325,8 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF
this->Show();
#ifdef ZEN_MAC
ProcessSerialNumber psn = { 0, kCurrentProcess };
- ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon (consider non-silent batch mode)
+ ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
#endif
pnl.m_buttonStop->SetFocus(); //don't steal focus when starting in sys-tray!
@@ -1207,9 +1350,9 @@ SyncProgressDialogImpl<TopLevelDialog>::~SyncProgressDialogImpl()
parentFrame_->Show();
#ifdef ZEN_MAC
ProcessSerialNumber psn = { 0, kCurrentProcess };
- ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
//why isn't this covered by wxWindows::Raise()??
::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon (consider GUI mode with "close progress dialog")
+ ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
#endif
//if (parentFrame_->IsIconized()) //caveat: if window is maximized calling Iconize(false) will erroneously un-maximize!
// parentFrame_->Iconize(false);
@@ -1265,7 +1408,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::initNewPhase()
perf = make_unique<PerfCheck>(WINDOW_REMAINING_TIME, WINDOW_BYTES_PER_SEC);
lastStatCallSpeed = -1000000; //some big number
- phaseStartMs = timeElapsed.Time();
+ phaseStartMs = timeElapsed.timeMs();
updateGuiInt(false);
}
@@ -1283,8 +1426,8 @@ void SyncProgressDialogImpl<TopLevelDialog>::notifyProgressChange() //noexcept!
break;
case ProcessCallback::PHASE_COMPARING_CONTENT:
case ProcessCallback::PHASE_SYNCHRONIZING:
- curveDataBytes->addRecord(timeElapsed.Time(), to<double>(syncStat_->getDataCurrent (syncStat_->currentPhase())));
- curveDataItems->addRecord(timeElapsed.Time(), syncStat_->getObjectsCurrent(syncStat_->currentPhase()));
+ curveDataBytes->addRecord(timeElapsed.timeMs(), to<double>(syncStat_->getDataCurrent (syncStat_->currentPhase())));
+ curveDataItems->addRecord(timeElapsed.timeMs(), syncStat_->getObjectsCurrent(syncStat_->currentPhase()));
break;
}
}
@@ -1390,7 +1533,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield)
return;
bool layoutChanged = false; //avoid screen flicker by calling layout() only if necessary
- const long timeNow = timeElapsed.Time();
+ const int64_t timeNow = timeElapsed.timeMs();
//sync status text
setText(*pnl.m_staticTextStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts!
@@ -1482,7 +1625,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield)
pnl.m_panelGraphItems->Refresh();
//time elapsed
- const long timeElapSec = timeNow / 1000;
+ const int64_t timeElapSec = timeNow / 1000;
setText(*pnl.m_staticTextTimeElapsed,
timeElapSec < 3600 ?
wxTimeSpan::Seconds(timeElapSec).Format( L"%M:%S") :
@@ -1724,7 +1867,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::processHasFinished(SyncResult resul
assert(dataCurrent <= dataTotal);
//set overall speed (instead of current speed)
- const long timeDelta = timeElapsed.Time() - phaseStartMs; //we need to consider "time within current phase" not total "timeElapsed"!
+ const int64_t timeDelta = timeElapsed.timeMs() - phaseStartMs; //we need to consider "time within current phase" not total "timeElapsed"!
const wxString overallBytesPerSecond = timeDelta == 0 ? wxString() : filesizeToShortString(dataCurrent * 1000 / timeDelta) + _("/sec");
const wxString overallItemsPerSecond = timeDelta == 0 ? wxString() : replaceCpy(_("%x items/sec"), L"%x", formatThreeDigitPrecision(itemsCurrent * 1000.0 / timeDelta));
@@ -1969,9 +2112,9 @@ void SyncProgressDialogImpl<TopLevelDialog>::resumeFromSystray()
#ifdef ZEN_MAC
ProcessSerialNumber psn = { 0, kCurrentProcess };
- ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
//why isn't this covered by wxWindows::Raise()??
::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon again
+ ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly
#endif
}
}
diff --git a/ui/progress_indicator.h b/FreeFileSync/Source/ui/progress_indicator.h
index e2dbb99c..e2dbb99c 100644
--- a/ui/progress_indicator.h
+++ b/FreeFileSync/Source/ui/progress_indicator.h
diff --git a/ui/search.cpp b/FreeFileSync/Source/ui/search.cpp
index c834b934..416d2c9e 100644
--- a/ui/search.cpp
+++ b/FreeFileSync/Source/ui/search.cpp
@@ -71,11 +71,10 @@ std::pair<const Grid*, ptrdiff_t> zen::findGridMatch(const Grid& grid1, const Gr
{
const size_t rowCountL = grid1.getRowCount();
const size_t rowCountR = grid2.getRowCount();
- auto cursorPos = grid1.getGridCursor(); //(row, component pos)
std::pair<const Grid*, ptrdiff_t> result(nullptr, -1);
- size_t cursorRowL = cursorPos.first;
+ size_t cursorRowL = grid1.getGridCursor();
if (cursorRowL >= rowCountL)
cursorRowL = 0;
{
diff --git a/ui/search.h b/FreeFileSync/Source/ui/search.h
index 1adf3d01..1adf3d01 100644
--- a/ui/search.h
+++ b/FreeFileSync/Source/ui/search.h
diff --git a/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp
index df2e3e7a..785f558d 100644
--- a/ui/small_dlgs.cpp
+++ b/FreeFileSync/Source/ui/small_dlgs.cpp
@@ -60,19 +60,19 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
m_animCtrlWink->Play();
//create language credits
- for (auto it = ExistingTranslations::get().begin(); it != ExistingTranslations::get().end(); ++it)
+ for (const ExistingTranslations::Entry& trans : ExistingTranslations::get())
{
//flag
- wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, getResourceImage(it->languageFlag), wxDefaultPosition, wxSize(-1, 11), 0 );
+ wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, getResourceImage(trans.languageFlag), wxDefaultPosition, wxSize(-1, 11), 0 );
fgSizerTranslators->Add(staticBitmapFlag, 0, wxALIGN_CENTER);
//translator name
- wxStaticText* staticTextTranslator = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, it->translatorName, wxDefaultPosition, wxDefaultSize, 0 );
+ wxStaticText* staticTextTranslator = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, trans.translatorName, wxDefaultPosition, wxDefaultSize, 0 );
staticTextTranslator->Wrap(-1);
fgSizerTranslators->Add(staticTextTranslator, 0, wxALIGN_CENTER_VERTICAL);
- staticBitmapFlag ->SetToolTip(it->languageName);
- staticTextTranslator->SetToolTip(it->languageName);
+ staticBitmapFlag ->SetToolTip(trans.languageName);
+ staticTextTranslator->SetToolTip(trans.languageName);
}
fgSizerTranslators->Fit(m_scrolledWindowTranslators);
@@ -82,17 +82,12 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
//build information
wxString build = __TDATE__;
-#if wxUSE_UNICODE
build += L" - Unicode";
-#else
- build += L" - ANSI";
-#endif //wxUSE_UNICODE
+#ifndef wxUSE_UNICODE
+#error what is going on?
+#endif
- //compile time info about 32/64-bit build
- if (zen::is64BitBuild)
- build += L" x64";
- else
- build += L" x86";
+ build += zen::is64BitBuild ? L" x64" : L" x86";
assert_static(zen::is32BitBuild || zen::is64BitBuild);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
@@ -774,12 +769,12 @@ void GlobalSettingsDlg::onResize(wxSizeEvent& event)
{
const int widthTotal = m_gridCustomCommand->GetGridWindow()->GetClientSize().GetWidth();
- if (widthTotal >= 0 && m_gridCustomCommand->GetCols() == 2)
+ if (widthTotal >= 0 && m_gridCustomCommand->GetNumberCols() == 2)
{
const int w0 = widthTotal * 2 / 5; //ratio 2 : 3
const int w1 = widthTotal - w0;
- m_gridCustomCommand->SetColumnWidth(0, w0);
- m_gridCustomCommand->SetColumnWidth(1, w1);
+ m_gridCustomCommand->SetColSize(0, w0);
+ m_gridCustomCommand->SetColSize(1, w1);
m_gridCustomCommand->Refresh(); //required on Ubuntu
}
@@ -829,7 +824,7 @@ void GlobalSettingsDlg::OnResetDialogs(wxCommandEvent& event)
void GlobalSettingsDlg::OnDefault(wxCommandEvent& event)
{
- xmlAccess::XmlGlobalSettings defaultCfg;
+ const xmlAccess::XmlGlobalSettings defaultCfg;
m_checkBoxFailSafe ->SetValue(defaultCfg.failsafeFileCopy);
m_checkBoxCopyLocked ->SetValue(defaultCfg.copyLockedFiles);
diff --git a/ui/small_dlgs.h b/FreeFileSync/Source/ui/small_dlgs.h
index 311a7d14..311a7d14 100644
--- a/ui/small_dlgs.h
+++ b/FreeFileSync/Source/ui/small_dlgs.h
diff --git a/ui/sorting.h b/FreeFileSync/Source/ui/sorting.h
index 46477d0f..46477d0f 100644
--- a/ui/sorting.h
+++ b/FreeFileSync/Source/ui/sorting.h
diff --git a/ui/switch_to_gui.h b/FreeFileSync/Source/ui/switch_to_gui.h
index 20fe81de..20fe81de 100644
--- a/ui/switch_to_gui.h
+++ b/FreeFileSync/Source/ui/switch_to_gui.h
diff --git a/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp
index 38e583fc..38e583fc 100644
--- a/ui/sync_cfg.cpp
+++ b/FreeFileSync/Source/ui/sync_cfg.cpp
diff --git a/ui/sync_cfg.h b/FreeFileSync/Source/ui/sync_cfg.h
index e56a533b..e56a533b 100644
--- a/ui/sync_cfg.h
+++ b/FreeFileSync/Source/ui/sync_cfg.h
diff --git a/ui/taskbar.cpp b/FreeFileSync/Source/ui/taskbar.cpp
index e6aadc90..d65d1fbc 100644
--- a/ui/taskbar.cpp
+++ b/FreeFileSync/Source/ui/taskbar.cpp
@@ -9,7 +9,7 @@
#ifdef ZEN_WIN
#include <zen/dll.h>
#include <zen/win_ver.h>
-#include "Taskbar_Seven/taskbar.h"
+#include "../dll/Taskbar_Seven/taskbar.h"
#elif defined HAVE_UBUNTU_UNITY
#include <unity/unity/unity.h>
diff --git a/ui/taskbar.h b/FreeFileSync/Source/ui/taskbar.h
index 82e08656..82e08656 100644
--- a/ui/taskbar.h
+++ b/FreeFileSync/Source/ui/taskbar.h
diff --git a/ui/tray_icon.cpp b/FreeFileSync/Source/ui/tray_icon.cpp
index 28842a80..28842a80 100644
--- a/ui/tray_icon.cpp
+++ b/FreeFileSync/Source/ui/tray_icon.cpp
diff --git a/ui/tray_icon.h b/FreeFileSync/Source/ui/tray_icon.h
index 24c97eb0..24c97eb0 100644
--- a/ui/tray_icon.h
+++ b/FreeFileSync/Source/ui/tray_icon.h
diff --git a/ui/tree_view.cpp b/FreeFileSync/Source/ui/tree_view.cpp
index 01eb8696..f3c728c4 100644
--- a/ui/tree_view.cpp
+++ b/FreeFileSync/Source/ui/tree_view.cpp
@@ -142,13 +142,73 @@ void calcPercentage(std::vector<std::pair<UInt64, int*>>& workList)
std::for_each(workList.begin(), workList.begin() + remainingPercent, [&](std::pair<UInt64, int*>& pair) { ++*pair.second; });
}
}
+
+
+Zstring getShortDisplayNameForFolderPair(const Zstring& dirLeftPf, const Zstring& dirRightPf) //post-fixed with separator
+{
+ assert(endsWith(dirLeftPf, FILE_NAME_SEPARATOR) || dirLeftPf .empty());
+ assert(endsWith(dirRightPf, FILE_NAME_SEPARATOR) || dirRightPf.empty());
+
+ auto itL = dirLeftPf .end();
+ auto itR = dirRightPf.end();
+
+ for (;;)
+ {
+ auto itLPrev = find_last(dirLeftPf .begin(), itL, FILE_NAME_SEPARATOR);
+ auto itRPrev = find_last(dirRightPf.begin(), itR, FILE_NAME_SEPARATOR);
+
+ if (itLPrev == itL ||
+ itRPrev == itR)
+ {
+ if (itLPrev == itL)
+ itLPrev = dirLeftPf.begin();
+ else
+ ++itLPrev; //skip separator
+ if (itRPrev == itR)
+ itRPrev = dirRightPf.begin();
+ else
+ ++itRPrev;
+
+ if (equal(itLPrev, itL, itRPrev, itR))
+ {
+ itL = itLPrev;
+ itR = itRPrev;
+ }
+ break;
+ }
+
+ if (!equal(itLPrev, itL, itRPrev, itR))
+ break;
+ itL = itLPrev;
+ itR = itRPrev;
+ }
+
+ Zstring commonPostfix(itL, dirLeftPf.end());
+ if (startsWith(commonPostfix, FILE_NAME_SEPARATOR))
+ commonPostfix = afterFirst(commonPostfix, FILE_NAME_SEPARATOR);
+ if (endsWith(commonPostfix, FILE_NAME_SEPARATOR))
+ commonPostfix.resize(commonPostfix.size() - 1);
+
+ if (commonPostfix.empty())
+ {
+ auto getLastComponent = [](const Zstring& dirPf) { return afterLast(beforeLast(dirPf, FILE_NAME_SEPARATOR), FILE_NAME_SEPARATOR); }; //returns the whole string if term not found
+ if (dirLeftPf.empty())
+ return getLastComponent(dirRightPf);
+ else if (dirRightPf.empty())
+ return getLastComponent(dirLeftPf);
+ else
+ return getLastComponent(dirLeftPf) + utfCvrtTo<Zstring>(L" \u2212 ") + //= unicode minus
+ getLastComponent(dirRightPf);
+ }
+ return commonPostfix;
+}
}
template <bool ascending>
struct TreeView::LessShortName
{
- bool operator()(const TreeLine& lhs, const TreeLine& rhs)
+ bool operator()(const TreeLine& lhs, const TreeLine& rhs) const
{
//files last (irrespective of sort direction)
if (lhs.type_ == TreeView::TYPE_FILES)
@@ -157,17 +217,18 @@ struct TreeView::LessShortName
return true;
if (lhs.type_ != rhs.type_) //
- return lhs.type_ < rhs.type_; //shouldn't happen! Root nodes are never sorted
+ return lhs.type_ < rhs.type_; //shouldn't happen! root nodes not mixed with files or directories
switch (lhs.type_)
{
case TreeView::TYPE_ROOT:
- return false;
+ return makeSortDirection(LessFilename(), Int2Type<ascending>())(static_cast<const RootNodeImpl*>(lhs.node_)->displayName,
+ static_cast<const RootNodeImpl*>(rhs.node_)->displayName);
case TreeView::TYPE_DIRECTORY:
{
- const auto* dirObjL = dynamic_cast<const DirPair*>(FileSystemObject::retrieve(static_cast<const TreeView::DirNodeImpl*>(lhs.node_)->objId));
- const auto* dirObjR = dynamic_cast<const DirPair*>(FileSystemObject::retrieve(static_cast<const TreeView::DirNodeImpl*>(rhs.node_)->objId));
+ const auto* dirObjL = dynamic_cast<const DirPair*>(FileSystemObject::retrieve(static_cast<const DirNodeImpl*>(lhs.node_)->objId));
+ const auto* dirObjR = dynamic_cast<const DirPair*>(FileSystemObject::retrieve(static_cast<const DirNodeImpl*>(rhs.node_)->objId));
if (!dirObjL) //might be pathologic, but it's covered
return false;
@@ -244,12 +305,11 @@ void TreeView::getChildren(const Container& cont, unsigned int level, std::vecto
output.reserve(cont.subDirs.size() + 1); //keep pointers in "workList" valid
std::vector<std::pair<UInt64, int*>> workList;
- std::for_each(cont.subDirs.begin(), cont.subDirs.end(),
- [&output, level, &workList](const DirNodeImpl& subDir)
+ for (const DirNodeImpl& subDir : cont.subDirs)
{
output.push_back(TreeView::TreeLine(level, 0, &subDir, TreeView::TYPE_DIRECTORY));
workList.push_back(std::make_pair(subDir.bytesGross, &output.back().percent_));
- });
+ }
if (cont.firstFileId)
{
@@ -309,17 +369,24 @@ void TreeView::applySubView(std::vector<RootNodeImpl>&& newView)
}
else
{
- std::vector<std::pair<UInt64, int*>> workList;
+ //following is almost identical with TreeView::getChildren(): however we *cannot* reuse code here;
+ //this were only possible if we replaced "std::vector<RootNodeImpl>" with "Container"!
+
flatTree.reserve(folderCmpView.size()); //keep pointers in "workList" valid
+ std::vector<std::pair<UInt64, int*>> workList;
- std::for_each(folderCmpView.begin(), folderCmpView.end(),
- [&](const RootNodeImpl& root)
+ for (const RootNodeImpl& root : folderCmpView)
{
flatTree.push_back(TreeView::TreeLine(0, 0, &root, TreeView::TYPE_ROOT));
workList.push_back(std::make_pair(root.bytesGross, &flatTree.back().percent_));
- });
+ }
calcPercentage(workList);
+
+ if (sortAscending)
+ sortSingleLevel<true>(flatTree, sortColumn);
+ else
+ sortSingleLevel<false>(flatTree, sortColumn);
}
//restore node expansion status
@@ -346,23 +413,25 @@ void TreeView::updateView(Predicate pred)
std::vector<RootNodeImpl> newView;
newView.reserve(folderCmp.size()); //avoid expensive reallocations!
- std::for_each(folderCmp.begin(), folderCmp.end(),
- [&](const std::shared_ptr<BaseDirPair>& baseObj)
+ for (const std::shared_ptr<BaseDirPair>& baseObj : folderCmp)
{
newView.push_back(TreeView::RootNodeImpl());
RootNodeImpl& root = newView.back();
this->extractVisibleSubtree(*baseObj, root, pred); //"this->" is bogus for a static method, but GCC screws this one up
//warning: the following lines are almost 1:1 copy from extractVisibleSubtree:
- //however we *cannot* reuse code here; this were only possible if we could replace "std::vector<RootNodeImpl>" by "Container"!
+ //however we *cannot* reuse code here; this were only possible if we replaced "std::vector<RootNodeImpl>" with "Container"!
if (!root.firstFileId && root.subDirs.empty())
newView.pop_back();
else
{
root.baseDirObj = baseObj;
+ root.displayName = getShortDisplayNameForFolderPair(baseObj->getBaseDirPf<LEFT_SIDE >(),
+ baseObj->getBaseDirPf<RIGHT_SIDE>());
+
this->compressNode(root); //"this->" required by two-pass lookup as enforced by GCC 4.7
}
- });
+ }
lastViewFilterPred = pred;
applySubView(std::move(newView));
@@ -611,7 +680,7 @@ std::unique_ptr<TreeView::Node> TreeView::getLine(size_t row) const
case TreeView::TYPE_ROOT:
{
const auto* root = static_cast<const TreeView::RootNodeImpl*>(flatTree[row].node_);
- return make_unique<TreeView::RootNode>(percent, root->bytesGross, root->itemCountGross, getStatus(row), *(root->baseDirObj));
+ return make_unique<TreeView::RootNode>(percent, root->bytesGross, root->itemCountGross, getStatus(row), *(root->baseDirObj), root->displayName);
}
break;
@@ -653,66 +722,6 @@ std::unique_ptr<TreeView::Node> TreeView::getLine(size_t row) const
namespace
{
-wxString getShortDisplayNameForFolderPair(const Zstring& dirLeftPf, const Zstring& dirRightPf) //post-fixed with separator
-{
- assert(endsWith(dirLeftPf, FILE_NAME_SEPARATOR) || dirLeftPf .empty());
- assert(endsWith(dirRightPf, FILE_NAME_SEPARATOR) || dirRightPf.empty());
-
- auto itL = dirLeftPf .end();
- auto itR = dirRightPf.end();
-
- for (;;)
- {
- auto itLPrev = find_last(dirLeftPf .begin(), itL, FILE_NAME_SEPARATOR);
- auto itRPrev = find_last(dirRightPf.begin(), itR, FILE_NAME_SEPARATOR);
-
- if (itLPrev == itL ||
- itRPrev == itR)
- {
- if (itLPrev == itL)
- itLPrev = dirLeftPf.begin();
- else
- ++itLPrev; //skip separator
- if (itRPrev == itR)
- itRPrev = dirRightPf.begin();
- else
- ++itRPrev;
-
- if (equal(itLPrev, itL, itRPrev, itR))
- {
- itL = itLPrev;
- itR = itRPrev;
- }
- break;
- }
-
- if (!equal(itLPrev, itL, itRPrev, itR))
- break;
- itL = itLPrev;
- itR = itRPrev;
- }
-
- Zstring commonPostfix(itL, dirLeftPf.end());
- if (startsWith(commonPostfix, FILE_NAME_SEPARATOR))
- commonPostfix = afterFirst(commonPostfix, FILE_NAME_SEPARATOR);
- if (endsWith(commonPostfix, FILE_NAME_SEPARATOR))
- commonPostfix.resize(commonPostfix.size() - 1);
-
- if (commonPostfix.empty())
- {
- auto getLastComponent = [](const Zstring& dirPf) { return utfCvrtTo<wxString>(afterLast(beforeLast(dirPf, FILE_NAME_SEPARATOR), FILE_NAME_SEPARATOR)); }; //returns the whole string if term not found
- if (dirLeftPf.empty())
- return getLastComponent(dirRightPf);
- else if (dirRightPf.empty())
- return getLastComponent(dirLeftPf);
- else
- return getLastComponent(dirLeftPf) + L" \u2212 " + //= unicode minus
- getLastComponent(dirRightPf);
- }
- return utfCvrtTo<wxString>(commonPostfix);
-}
-
-
const wxColour COLOR_LEVEL0(0xcc, 0xcc, 0xff);
const wxColour COLOR_LEVEL1(0xcc, 0xff, 0xcc);
const wxColour COLOR_LEVEL2(0xff, 0xff, 0x99);
@@ -803,8 +812,7 @@ private:
case COL_TYPE_NAVI_DIRECTORY:
if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
- return getShortDisplayNameForFolderPair(root->baseDirObj_.getBaseDirPf<LEFT_SIDE >(),
- root->baseDirObj_.getBaseDirPf<RIGHT_SIDE>());
+ return utfCvrtTo<wxString>(root->displayName_);
else if (const TreeView::DirNode* dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
return utfCvrtTo<wxString>(dir->dirObj_.getObjShortName());
else if (dynamic_cast<const TreeView::FilesNode*>(node.get()))
@@ -1127,7 +1135,7 @@ private:
const size_t rowCount = grid_.getRowCount();
if (rowCount == 0) return;
- size_t row = grid_.getGridCursor().first;
+ size_t row = grid_.getGridCursor();
if (event.ShiftDown())
;
else if (event.ControlDown())
@@ -1193,11 +1201,8 @@ private:
}
};
- const auto& colAttr = grid_.getColumnConfig();
- for (auto it = colAttr.begin(); it != colAttr.end(); ++it)
+ for (const Grid::ColumnAttribute& ca : grid_.getColumnConfig())
{
- const Grid::ColumnAttribute& ca = *it;
-
menu.addCheckBox(getColumnLabel(ca.type_), [ca, toggleColumn]() { toggleColumn(ca); },
ca.visible_, ca.type_ != static_cast<ColumnType>(COL_TYPE_NAVI_DIRECTORY)); //do not allow user to hide file name column!
}
@@ -1228,7 +1233,7 @@ private:
sortAscending = !sortInfo.second;
treeDataView_->setSortDirection(colTypeNavi, sortAscending);
- grid_.clearSelection();
+ grid_.clearSelection(ALLOW_GRID_EVENT);
grid_.Refresh();
}
}
diff --git a/ui/tree_view.h b/FreeFileSync/Source/ui/tree_view.h
index 719212dd..d42d898f 100644
--- a/ui/tree_view.h
+++ b/FreeFileSync/Source/ui/tree_view.h
@@ -82,8 +82,9 @@ public:
struct RootNode : public Node
{
- RootNode(int percent, UInt64 bytes, int itemCount, NodeStatus status, BaseDirPair& baseDirObj) : Node(percent, bytes, itemCount, 0, status), baseDirObj_(baseDirObj) {}
+ RootNode(int percent, UInt64 bytes, int itemCount, NodeStatus status, BaseDirPair& baseDirObj, const Zstring displayName) : Node(percent, bytes, itemCount, 0, status), baseDirObj_(baseDirObj), displayName_(displayName) {}
BaseDirPair& baseDirObj_;
+ Zstring displayName_;
};
std::unique_ptr<Node> getLine(size_t row) const; //return nullptr on error
@@ -126,6 +127,7 @@ private:
{
RootNodeImpl() {}
std::shared_ptr<BaseDirPair> baseDirObj;
+ Zstring displayName;
};
enum NodeType
@@ -142,7 +144,7 @@ private:
unsigned int level_;
int percent_; //[0, 100]
const Container* node_; //
- NodeType type_; //we choose to increase size of "flatTree" rather than "folderCmpView" by not using dynamic polymorphism!
+ NodeType type_; //we increase size of "flatTree" using C-style types rather than have a polymorphic "folderCmpView"
};
static void compressNode(Container& cont);
diff --git a/ui/triple_splitter.cpp b/FreeFileSync/Source/ui/triple_splitter.cpp
index fbdd22d7..fbdd22d7 100644
--- a/ui/triple_splitter.cpp
+++ b/FreeFileSync/Source/ui/triple_splitter.cpp
diff --git a/ui/triple_splitter.h b/FreeFileSync/Source/ui/triple_splitter.h
index 0577dabf..0577dabf 100644
--- a/ui/triple_splitter.h
+++ b/FreeFileSync/Source/ui/triple_splitter.h
diff --git a/ui/wx_form_build_hide_warnings.h b/FreeFileSync/Source/ui/wx_form_build_hide_warnings.h
index 71f28340..71f28340 100644
--- a/ui/wx_form_build_hide_warnings.h
+++ b/FreeFileSync/Source/ui/wx_form_build_hide_warnings.h
diff --git a/version/version.h b/FreeFileSync/Source/version/version.h
index 1eff0d52..b3dca56b 100644
--- a/version/version.h
+++ b/FreeFileSync/Source/version/version.h
@@ -3,7 +3,7 @@
namespace zen
{
-const wchar_t currentVersion[] = L"5.22"; //internal linkage!
+const wchar_t currentVersion[] = L"5.23"; //internal linkage!
}
#endif
diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp
deleted file mode 100644
index 717a8535..00000000
--- a/ui/gui_generated.cpp
+++ /dev/null
@@ -1,3505 +0,0 @@
-///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 8 2012)
-// http://www.wxformbuilder.org/
-//
-// PLEASE DO "NOT" EDIT THIS FILE!
-///////////////////////////////////////////////////////////////////////////
-
-#include "../wx+/bitmap_button.h"
-#include "../wx+/graph.h"
-#include "../wx+/grid.h"
-#include "../wx+/toggle_button.h"
-#include "exec_finished_box.h"
-#include "folder_history_box.h"
-#include "triple_splitter.h"
-
-#include "gui_generated.h"
-
-///////////////////////////////////////////////////////////////////////////
-
-MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxSize( 640,400 ), wxDefaultSize );
-
- m_menubar1 = new wxMenuBar( 0 );
- m_menuFile = new wxMenu();
- m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemNew );
-
- m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemLoad );
-
- m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemSave );
-
- m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemSaveAs );
-
- m_menuItem7 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItem7 );
-
- m_menuFile->AppendSeparator();
-
- m_menuItem10 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItem10 );
-
- m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItem11 );
-
- m_menuFile->AppendSeparator();
-
- wxMenuItem* m_menuItem4;
- m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItem4 );
-
- m_menubar1->Append( m_menuFile, _("&Program") );
-
- m_menuTools = new wxMenu();
- m_menuItemGlobSett = new wxMenuItem( m_menuTools, wxID_PREFERENCES, wxString( _("&Global settings") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItemGlobSett );
-
- m_menuTools->AppendSeparator();
-
- m_menuLanguages = new wxMenu();
- m_menuTools->Append( -1, _("&Language"), m_menuLanguages );
-
- wxMenuItem* m_menuItem15;
- m_menuItem15 = new wxMenuItem( m_menuTools, wxID_FIND, wxString( _("&Find...") ) + wxT('\t') + wxT("Ctrl+F"), wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItem15 );
-
- wxMenuItem* m_menuItem5;
- m_menuItem5 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItem5 );
-
- m_menubar1->Append( m_menuTools, _("&Tools") );
-
- m_menuHelp = new wxMenu();
- m_menuItemManual = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&View help") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL );
- m_menuHelp->Append( m_menuItemManual );
-
- m_menuCheckVersion = new wxMenu();
- m_menuItemCheckVersionNow = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("&Check now") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuCheckVersion->Append( m_menuItemCheckVersionNow );
-
- m_menuItemCheckVersionAuto = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("Check &automatically once a week") ) , wxEmptyString, wxITEM_CHECK );
- m_menuCheckVersion->Append( m_menuItemCheckVersionAuto );
- m_menuItemCheckVersionAuto->Check( true );
-
- m_menuHelp->Append( -1, _("&Check for new version"), m_menuCheckVersion );
-
- m_menuHelp->AppendSeparator();
-
- m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL );
- m_menuHelp->Append( m_menuItemAbout );
-
- m_menubar1->Append( m_menuHelp, _("&Help") );
-
- this->SetMenuBar( m_menubar1 );
-
- bSizerPanelHolder = new wxBoxSizer( wxVERTICAL );
-
- m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL );
- bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer1721;
- bSizer1721 = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonCompare->SetDefault();
- m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_buttonCompare->SetToolTip( _("dummy") );
-
- bSizer1721->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_buttonCancel = new zen::BitmapTextButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( 180,-1 ), 0 );
- m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_buttonCancel->Enable( false );
- m_buttonCancel->Hide();
-
- bSizer1721->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- m_bpButtonCmpConfig->SetToolTip( _("dummy") );
-
- bSizer1721->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 );
-
-
- bSizerTopButtons->Add( bSizer1721, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 4 );
-
-
- bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer1731;
- bSizer1731 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- m_bpButtonSyncConfig->SetToolTip( _("dummy") );
-
- bSizer1731->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 );
-
- m_buttonSync = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_buttonSync->SetToolTip( _("dummy") );
-
- bSizer1731->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerTopButtons->Add( bSizer1731, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 4 );
-
-
- bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelTopButtons->SetSizer( bSizerTopButtons );
- m_panelTopButtons->Layout();
- bSizerTopButtons->Fit( m_panelTopButtons );
- bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1601;
- bSizer1601 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer91;
- bSizer91 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelTopLeft->SetMinSize( wxSize( 1,-1 ) );
-
- wxFlexGridSizer* fgSizer8;
- fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 );
- fgSizer8->AddGrowableCol( 1 );
- fgSizer8->SetFlexibleDirection( wxBOTH );
- fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL );
-
-
- fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextResolvedPathL->Wrap( -1 );
- fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
- wxBoxSizer* bSizer159;
- bSizer159 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonAddPair->SetToolTip( _("Add folder pair") );
-
- bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
-
- bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer182;
- bSizer182 = new wxBoxSizer( wxHORIZONTAL );
-
- m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
-
- bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- fgSizer8->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelTopLeft->SetSizer( fgSizer8 );
- m_panelTopLeft->Layout();
- fgSizer8->Fit( m_panelTopLeft );
- bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1771;
- bSizer1771 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSwapSides->SetToolTip( _("Swap sides") );
-
- bSizer1771->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
-
- m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panelTopMiddle->SetSizer( bSizer1771 );
- m_panelTopMiddle->Layout();
- bSizer1771->Fit( m_panelTopMiddle );
- bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelTopRight->SetMinSize( wxSize( 1,-1 ) );
-
- wxBoxSizer* bSizer183;
- bSizer183 = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextResolvedPathR->Wrap( -1 );
- bSizer183->Add( m_staticTextResolvedPathR, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
- wxBoxSizer* bSizer179;
- bSizer179 = new wxBoxSizer( wxHORIZONTAL );
-
- m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
-
- bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelTopRight->SetSizer( bSizer183 );
- m_panelTopRight->Layout();
- bSizer183->Fit( m_panelTopRight );
- bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
-
- bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 );
-
- m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL );
- m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 );
- m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) );
-
- bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL );
-
-
- m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs );
- m_scrolledWindowFolderPairs->Layout();
- bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs );
- bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelDirectoryPairs->SetSizer( bSizer1601 );
- m_panelDirectoryPairs->Layout();
- bSizer1601->Fit( m_panelDirectoryPairs );
- bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_gridNavi = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridNavi->SetScrollRate( 5, 5 );
- bSizerPanelHolder->Add( m_gridNavi, 1, wxEXPAND, 5 );
-
- m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1711;
- bSizer1711 = new wxBoxSizer( wxVERTICAL );
-
- m_splitterMain = new zen::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1781;
- bSizer1781 = new wxBoxSizer( wxHORIZONTAL );
-
- m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMainL->SetScrollRate( 5, 5 );
- bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 );
-
- m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMainC->SetScrollRate( 5, 5 );
- bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 );
-
- m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMainR->SetScrollRate( 5, 5 );
- bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 );
-
-
- m_splitterMain->SetSizer( bSizer1781 );
- m_splitterMain->Layout();
- bSizer1781->Fit( m_splitterMain );
- bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 );
-
- m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer451;
- bSizer451 = new wxBoxSizer( wxHORIZONTAL );
-
- bSizer451->SetMinSize( wxSize( -1,22 ) );
- bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer53;
- bSizer53 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftDirs->Wrap( -1 );
- bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
-
- m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftFiles->Wrap( -1 );
- bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeftFiles->Add( 4, 0, 0, 0, 5 );
-
- m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftBytes->Wrap( -1 );
- bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizerStatusLeft->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 2 );
-
-
- bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusMiddle->Wrap( -1 );
- bSizerFileStatus->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 );
-
- wxBoxSizer* bSizer52;
- bSizer52 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightDirs->Wrap( -1 );
- bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
-
- m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightFiles->Wrap( -1 );
- bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRightFiles->Add( 4, 0, 0, 0, 5 );
-
- m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightBytes->Wrap( -1 );
- bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRight->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer451->Add( bSizerFileStatus, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextFullStatus->Wrap( -1 );
- m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- m_panelStatusBar->SetSizer( bSizer451 );
- m_panelStatusBar->Layout();
- bSizer451->Fit( m_panelStatusBar );
- bSizer1711->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
-
- m_panelCenter->SetSizer( bSizer1711 );
- m_panelCenter->Layout();
- bSizer1711->Fit( m_panelCenter );
- bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 );
-
- m_panelSearch = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1713;
- bSizer1713 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonHideSearch->SetToolTip( _("Close search bar") );
-
- bSizer1713->Add( m_bpButtonHideSearch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_staticText101 = new wxStaticText( m_panelSearch, wxID_ANY, _("Find:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText101->Wrap( -1 );
- bSizer1713->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0|wxWANTS_CHARS );
- m_textCtrlSearchTxt->SetMaxLength( 0 );
- bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer1713->Add( m_checkBoxMatchCase, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- m_panelSearch->SetSizer( bSizer1713 );
- m_panelSearch->Layout();
- bSizer1713->Fit( m_panelSearch );
- bSizerPanelHolder->Add( m_panelSearch, 0, 0, 5 );
-
- m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizerConfig = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer151;
- bSizer151 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonOpen->SetToolTip( _("dummy") );
-
- bSizer151->Add( m_bpButtonOpen, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonSave->SetToolTip( _("dummy") );
-
- bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonBatchJob = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonBatchJob->SetToolTip( _("Save as batch job") );
-
- bSizer151->Add( m_bpButtonBatchJob, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB );
- m_listBoxHistory->SetMinSize( wxSize( -1,40 ) );
-
- bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelConfig->SetSizer( bSizerConfig );
- m_panelConfig->Layout();
- bSizerConfig->Fit( m_panelConfig );
- bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 );
-
- m_panelFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer171;
- bSizer171 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
- bSizer171->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_checkBoxHideExcluded = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxHideExcluded->SetToolTip( _("Show filtered or temporarily excluded files") );
-
- bSizer171->Add( m_checkBoxHideExcluded, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- m_panelFilter->SetSizer( bSizer171 );
- m_panelFilter->Layout();
- bSizer171->Fit( m_panelFilter );
- bSizerPanelHolder->Add( m_panelFilter, 0, 0, 5 );
-
- m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizer1801 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 );
-
- bSizerStatistics = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer1712;
- bSizer1712 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer1712->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateLeft->Wrap( -1 );
- m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerStatistics->Add( bSizer1712, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
-
- bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer172->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateLeft->Wrap( -1 );
- m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
-
- bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerStatistics->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer173->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteLeft->Wrap( -1 );
- m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- bSizerData = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapData->SetToolTip( _("Total bytes to copy") );
-
- bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerData->Add( 5, 2, 0, 0, 5 );
-
-
- bSizerData->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextData->Wrap( -1 );
- m_staticTextData->SetToolTip( _("Total bytes to copy") );
-
- bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizerData, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer176;
- bSizer176 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer176->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer176->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteRight->Wrap( -1 );
- m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer177;
- bSizer177 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
-
- bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer177->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer177->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateRight->Wrap( -1 );
- m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
-
- bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer178->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer178->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateRight->Wrap( -1 );
- m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer1801->Add( bSizerStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panelStatistics->SetSizer( bSizer1801 );
- m_panelStatistics->Layout();
- bSizer1801->Fit( m_panelStatistics );
- bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonViewTypeSyncAction = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bpButtonShowCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowUpdateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowUpdateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panelViewFilter->SetSizer( bSizerViewFilter );
- m_panelViewFilter->Layout();
- bSizerViewFilter->Fit( m_panelViewFilter );
- bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- this->SetSizer( bSizerPanelHolder );
- this->Layout();
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
- this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) );
- this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) );
- this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) );
- this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) );
- this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) );
- this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
- this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
- this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
- this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) );
- this->Connect( m_menuItem15->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuFindItem ) );
- this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) );
- this->Connect( m_menuItemManual->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) );
- this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) );
- this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) );
- this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) );
- m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this );
- m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this );
- m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
- m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this );
- m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
- m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this );
- m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this );
- m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this );
- m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this );
- m_bpButtonHideSearch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideSearchPanel ), NULL, this );
- m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MainDialogGenerated::OnSearchGridEnter ), NULL, this );
- m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this );
- m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this );
- m_bpButtonBatchJob->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this );
- m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
- m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
- m_checkBoxHideExcluded->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this );
- m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this );
- m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
-}
-
-MainDialogGenerated::~MainDialogGenerated()
-{
-}
-
-CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer136;
- bSizer136 = new wxBoxSizer( wxVERTICAL );
-
- m_panel36 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel36->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer159;
- bSizer159 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer182;
- bSizer182 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText91 = new wxStaticText( m_panel36, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText91->Wrap( -1 );
- bSizer182->Add( m_staticText91, 0, wxALL, 5 );
-
- wxFlexGridSizer* fgSizer16;
- fgSizer16 = new wxFlexGridSizer( 2, 2, 5, 5 );
- fgSizer16->SetFlexibleDirection( wxBOTH );
- fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_bitmapByTime = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapByTime->SetToolTip( _("Identify equal files by comparing modification time and size.") );
-
- fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_toggleBtnTimeSize = new wxToggleButton( m_panel36, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnTimeSize->SetValue( true );
- m_toggleBtnTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_toggleBtnTimeSize->SetToolTip( _("Identify equal files by comparing modification time and size.") );
-
- fgSizer16->Add( m_toggleBtnTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_bitmapByContent = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapByContent->SetToolTip( _("Identify equal files by comparing the file content.") );
-
- fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_toggleBtnContent = new wxToggleButton( m_panel36, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_toggleBtnContent->SetToolTip( _("Identify equal files by comparing the file content.") );
-
- fgSizer16->Add( m_toggleBtnContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer182->Add( fgSizer16, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer159->Add( bSizer182, 0, wxALL, 5 );
-
- m_staticline33 = new wxStaticLine( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText92 = new wxStaticText( m_panel36, wxID_ANY, _("Symbolic links:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText92->Wrap( -1 );
- bSizer172->Add( m_staticText92, 0, wxBOTTOM, 5 );
-
- wxArrayString m_choiceHandleSymlinksChoices;
- m_choiceHandleSymlinks = new wxChoice( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 );
- m_choiceHandleSymlinks->SetSelection( -1 );
- bSizer172->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_hyperlink24 = new wxHyperlinkCtrl( m_panel36, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer172->Add( m_hyperlink24, 0, wxTOP, 5 );
-
-
- bSizer159->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 );
-
-
- m_panel36->SetSizer( bSizer159 );
- m_panel36->Layout();
- bSizer159->Fit( m_panel36 );
- bSizer136->Add( m_panel36, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer136->Add( m_staticline14, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonOkay->SetDefault();
- m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer136->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer136 );
- this->Layout();
- bSizer136->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) );
- m_toggleBtnTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this );
- m_toggleBtnTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this );
- m_toggleBtnContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this );
- m_toggleBtnContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this );
- m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this );
- m_hyperlink24->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( CmpCfgDlgGenerated::OnHelpComparisonSettings ), NULL, this );
- m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this );
-}
-
-CmpCfgDlgGenerated::~CmpCfgDlgGenerated()
-{
-}
-
-SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer7;
- bSizer7 = new wxBoxSizer( wxVERTICAL );
-
- m_panel37 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel37->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer29;
- bSizer29 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer183;
- bSizer183 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText86 = new wxStaticText( m_panel37, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText86->Wrap( -1 );
- bSizer183->Add( m_staticText86, 0, wxALL, 5 );
-
- wxFlexGridSizer* fgSizer1;
- fgSizer1 = new wxFlexGridSizer( 4, 2, 5, 5 );
- fgSizer1->SetFlexibleDirection( wxBOTH );
- fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- wxBoxSizer* bSizer171;
- bSizer171 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer171->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_toggleBtnTwoWay = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnTwoWay->SetValue( true );
- m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer171->Add( m_toggleBtnTwoWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer171->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- fgSizer1->Add( bSizer171, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_staticTextAutomatic = new wxStaticText( m_panel37, wxID_ANY, _("Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextAutomatic->Wrap( 480 );
- fgSizer1->Add( m_staticTextAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_toggleBtnMirror = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer172->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- fgSizer1->Add( bSizer172, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextMirror = new wxStaticText( m_panel37, wxID_ANY, _("Create a mirror backup of the left folder which exactly matches the right folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextMirror->Wrap( 480 );
- fgSizer1->Add( m_staticTextMirror, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_toggleBtnUpdate = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer173->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- fgSizer1->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_staticTextUpdate = new wxStaticText( m_panel37, wxID_ANY, _("Copy new and updated files to the right folder."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdate->Wrap( 480 );
- fgSizer1->Add( m_staticTextUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer1741;
- bSizer1741 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer1741->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_toggleBtnCustom = new wxToggleButton( m_panel37, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer1741->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer1741->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- fgSizer1->Add( bSizer1741, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextCustom = new wxStaticText( m_panel37, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCustom->Wrap( 480 );
- fgSizer1->Add( m_staticTextCustom, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer183->Add( fgSizer1, 0, wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer1751;
- bSizer1751 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer1751->Add( 8, 0, 0, 0, 5 );
-
- m_checkBoxDetectMove = new wxCheckBox( m_panel37, wxID_ANY, _("Detect moved files"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxDetectMove->SetValue(true);
- m_checkBoxDetectMove->SetToolTip( _("Requires database files. Not supported by all file systems.") );
-
- bSizer1751->Add( m_checkBoxDetectMove, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
-
-
- bSizer183->Add( bSizer1751, 0, wxEXPAND, 5 );
-
-
- bSizer29->Add( bSizer183, 0, wxALL, 5 );
-
- m_staticline32 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer29->Add( m_staticline32, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer184;
- bSizer184 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText87 = new wxStaticText( m_panel37, wxID_ANY, _("Delete files:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText87->Wrap( -1 );
- bSizer184->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer180;
- bSizer180 = new wxBoxSizer( wxHORIZONTAL );
-
- m_toggleBtnPermanent = new wxToggleButton( m_panel37, wxID_ANY, _("Permanent"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") );
-
- bSizer180->Add( m_toggleBtnPermanent, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_toggleBtnRecycler = new wxToggleButton( m_panel37, wxID_ANY, _("Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnRecycler->SetToolTip( _("Back up deleted and overwritten files in the recycle bin") );
-
- bSizer180->Add( m_toggleBtnRecycler, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_toggleBtnVersioning = new wxToggleButton( m_panel37, wxID_ANY, _("Versioning"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnVersioning->SetToolTip( _("Move files to a user-defined folder") );
-
- bSizer180->Add( m_toggleBtnVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer184->Add( bSizer180, 0, wxTOP, 5 );
-
- m_panelVersioning = new wxPanel( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer191;
- bSizer191 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer156;
- bSizer156 = new wxBoxSizer( wxHORIZONTAL );
-
- m_versioningFolder = new FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer156->Add( m_versioningFolder, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirVersioning = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirVersioning->SetToolTip( _("Select a folder") );
-
- bSizer156->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer191->Add( bSizer156, 1, wxEXPAND|wxBOTTOM, 5 );
-
- bSizer192 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText93 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText93->Wrap( -1 );
- bSizer192->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- wxArrayString m_choiceVersioningStyleChoices;
- m_choiceVersioningStyle = new wxChoice( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVersioningStyleChoices, 0 );
- m_choiceVersioningStyle->SetSelection( 0 );
- bSizer192->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_staticTextNamingCvtPart1 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextNamingCvtPart1->Wrap( -1 );
- m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer192->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextNamingCvtPart2Bold = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextNamingCvtPart2Bold->Wrap( -1 );
- m_staticTextNamingCvtPart2Bold->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer192->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextNamingCvtPart3 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextNamingCvtPart3->Wrap( -1 );
- m_staticTextNamingCvtPart3->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer192->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer192->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer192->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
-
- bSizer191->Add( bSizer192, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelVersioning->SetSizer( bSizer191 );
- m_panelVersioning->Layout();
- bSizer191->Fit( m_panelVersioning );
- bSizer184->Add( m_panelVersioning, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 );
-
-
- bSizer29->Add( bSizer184, 0, wxALL|wxEXPAND, 10 );
-
- bSizerExtraConfig = new wxBoxSizer( wxVERTICAL );
-
- m_staticline321 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerExtraConfig->Add( m_staticline321, 0, wxEXPAND, 5 );
-
- bSizer179 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText88 = new wxStaticText( m_panel37, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText88->Wrap( -1 );
- bSizer174->Add( m_staticText88, 0, wxBOTTOM, 5 );
-
- wxBoxSizer* bSizer175;
- bSizer175 = new wxBoxSizer( wxHORIZONTAL );
-
- m_toggleBtnErrorIgnore = new wxToggleButton( m_panel37, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") );
-
- bSizer175->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_toggleBtnErrorPopup = new wxToggleButton( m_panel37, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") );
-
- bSizer175->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer174->Add( bSizer175, 0, 0, 5 );
-
-
- bSizer179->Add( bSizer174, 0, wxALL, 10 );
-
- m_staticline36 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer179->Add( m_staticline36, 0, wxEXPAND, 5 );
-
- bSizerOnCompletion = new wxBoxSizer( wxVERTICAL );
-
- m_staticText89 = new wxStaticText( m_panel37, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText89->Wrap( -1 );
- bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 );
-
- m_comboBoxExecFinished = new ExecFinishedBox( m_panel37, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizerOnCompletion->Add( m_comboBoxExecFinished, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer179->Add( bSizerOnCompletion, 1, wxALL, 10 );
-
-
- bSizerExtraConfig->Add( bSizer179, 0, wxEXPAND, 5 );
-
-
- bSizer29->Add( bSizerExtraConfig, 0, wxEXPAND, 5 );
-
-
- bSizer181->Add( bSizer29, 0, wxEXPAND, 5 );
-
- m_staticline31 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer181->Add( m_staticline31, 0, wxEXPAND, 5 );
-
- bSizerConfig = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer18011;
- bSizer18011 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextHeaderCategory1 = new wxStaticText( m_panel37, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );
- m_staticTextHeaderCategory1->Wrap( -1 );
- bSizer18011->Add( m_staticTextHeaderCategory1, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer18011->Add( 5, 0, 0, 0, 5 );
-
- m_staticTextHeaderAction1 = new wxStaticText( m_panel37, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT );
- m_staticTextHeaderAction1->Wrap( -1 );
- bSizer18011->Add( m_staticTextHeaderAction1, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerConfig->Add( bSizer18011, 0, wxEXPAND, 5 );
-
-
- bSizerConfig->Add( 0, 5, 0, 0, 5 );
-
- m_bitmapDatabase = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerConfig->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 );
-
- wxBoxSizer* sbSizerKeepWidthStableIfSyncDirsNotShown;
- sbSizerKeepWidthStableIfSyncDirsNotShown = new wxBoxSizer( wxHORIZONTAL );
-
-
- sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 45, 0, 0, 0, 5 );
-
-
- sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 5, 0, 0, 0, 5 );
-
-
- sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 46, 0, 0, 0, 5 );
-
-
- bSizerConfig->Add( sbSizerKeepWidthStableIfSyncDirsNotShown, 0, 0, 5 );
-
- sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL );
-
- bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapLeftOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") );
-
- bSizerLeftOnly->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerLeftOnly->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLeftOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- sbSizerSyncDirections->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapRightOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") );
-
- bSizerRightOnly->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerRightOnly->Add( 5, 0, 0, 0, 5 );
-
- m_bpButtonRightOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- sbSizerSyncDirections->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapLeftNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapLeftNewer->SetToolTip( _("Left side is newer") );
-
- bSizerLeftNewer->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerLeftNewer->Add( 5, 0, 0, 0, 5 );
-
- m_bpButtonLeftNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- sbSizerSyncDirections->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapRightNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapRightNewer->SetToolTip( _("Right side is newer") );
-
- bSizerRightNewer->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerRightNewer->Add( 5, 0, 0, 0, 5 );
-
- m_bpButtonRightNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- sbSizerSyncDirections->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- bSizerDifferent = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapDifferent = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapDifferent->SetToolTip( _("Items have different content") );
-
- bSizerDifferent->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerDifferent->Add( 5, 0, 0, 0, 5 );
-
- m_bpButtonDifferent = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- sbSizerSyncDirections->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- bSizerConflict = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapConflict = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") );
-
- bSizerConflict->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerConflict->Add( 5, 0, 0, 0, 5 );
-
- m_bpButtonConflict = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- sbSizerSyncDirections->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerConfig->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 );
-
-
- bSizer181->Add( bSizerConfig, 0, wxALL|wxEXPAND, 10 );
-
-
- m_panel37->SetSizer( bSizer181 );
- m_panel37->Layout();
- bSizer181->Fit( m_panel37 );
- bSizer7->Add( m_panel37, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline15 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer7->Add( m_staticline15, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonOK->SetDefault();
- m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer7->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer7 );
- this->Layout();
- bSizer7->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) );
- m_toggleBtnTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncTwoWayDouble ), NULL, this );
- m_toggleBtnTwoWay->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncTwoWay ), NULL, this );
- m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this );
- m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
- m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this );
- m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
- m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this );
- m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
- m_checkBoxDetectMove->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnToggleDetectMovedFiles ), NULL, this );
- m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this );
- m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this );
- m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this );
- m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnParameterChange ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( SyncCfgDlgGenerated::OnHelpVersioning ), NULL, this );
- m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this );
- m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this );
- m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this );
- m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this );
- m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this );
- m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this );
- m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this );
- m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this );
- m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this );
-}
-
-SyncCfgDlgGenerated::~SyncCfgDlgGenerated()
-{
-}
-
-SyncConfirmationDlgGenerated::SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer134;
- bSizer134 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSync = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer72->Add( m_bitmapSync, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Start synchronization now?"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextHeader->Wrap( -1 );
- bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer134->Add( bSizer72, 0, 0, 5 );
-
- m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 );
-
- m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer185->Add( 0, 0, 1, 0, 5 );
-
- m_staticline38 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer185->Add( m_staticline38, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer182;
- bSizer182 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText84 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Variant:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText84->Wrap( -1 );
- bSizer182->Add( m_staticText84, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
-
- bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextVariant = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextVariant->Wrap( -1 );
- m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer182->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- bSizer162->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
-
- m_staticline14 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer162->Add( m_staticline14, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText83->Wrap( -1 );
- bSizer181->Add( m_staticText83, 0, wxALL, 5 );
-
- wxFlexGridSizer* fgSizer11;
- fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 );
- fgSizer11->SetFlexibleDirection( wxBOTH );
- fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
-
- fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapData->SetToolTip( _("Total bytes to copy") );
-
- fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
-
- fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateLeft->Wrap( -1 );
- m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateLeft->Wrap( -1 );
- m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
-
- fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteLeft->Wrap( -1 );
- m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextData->Wrap( -1 );
- m_staticTextData->SetToolTip( _("Total bytes to copy") );
-
- fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteRight->Wrap( -1 );
- m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateRight->Wrap( -1 );
- m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
-
- fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateRight->Wrap( -1 );
- m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer181->Add( fgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 5 );
-
-
- bSizer185->Add( bSizer162, 0, 0, 5 );
-
-
- m_panelStatistics->SetSizer( bSizer185 );
- m_panelStatistics->Layout();
- bSizer185->Fit( m_panelStatistics );
- bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 );
-
- m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer164;
- bSizer164 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer164->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonStartSync = new wxButton( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonStartSync->SetDefault();
- m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- bSizer134->Add( bSizer164, 1, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer134 );
- this->Layout();
- bSizer134->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::OnClose ) );
- m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnStartSync ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnCancel ), NULL, this );
-}
-
-SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated()
-{
-}
-
-FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
-{
- wxBoxSizer* bSizer74;
- bSizer74 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelLeft->SetMinSize( wxSize( 1,-1 ) );
-
- wxBoxSizer* bSizer134;
- bSizer134 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
-
- bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
-
- bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelLeft->SetSizer( bSizer134 );
- m_panelLeft->Layout();
- bSizer134->Fit( m_panelLeft );
- bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxEXPAND, 5 );
-
- m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer95;
- bSizer95 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
-
- m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panel20->SetSizer( bSizer95 );
- m_panel20->Layout();
- bSizer95->Fit( m_panel20 );
- bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
-
- m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelRight->SetMinSize( wxSize( 1,-1 ) );
-
- wxBoxSizer* bSizer135;
- bSizer135 = new wxBoxSizer( wxHORIZONTAL );
-
- m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
-
- bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelRight->SetSizer( bSizer135 );
- m_panelRight->Layout();
- bSizer135->Fit( m_panelRight );
- bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer74 );
- this->Layout();
- bSizer74->Fit( this );
-}
-
-FolderPairPanelGenerated::~FolderPairPanelGenerated()
-{
-}
-
-CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
-{
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer40;
- bSizer40 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer40->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
- m_textCtrlStatus->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer40->Add( m_textCtrlStatus, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
-
- m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH );
- bSizer40->Add( m_gauge2, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
- bSizer42 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer162StretchSpeedAndRemTimeIndependently;
- bSizer162StretchSpeedAndRemTimeIndependently = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer157;
- bSizer157 = new wxBoxSizer( wxVERTICAL );
-
- bSizerFilesFound = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText321 = new wxStaticText( this, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText321->Wrap( -1 );
- bSizerFilesFound->Add( m_staticText321, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextScanned->Wrap( -1 );
- m_staticTextScanned->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerFilesFound->Add( m_staticTextScanned, 0, wxALIGN_BOTTOM|wxLEFT, 5 );
-
-
- bSizer157->Add( bSizerFilesFound, 0, 0, 5 );
-
- bSizerFilesRemaining = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText46 = new wxStaticText( this, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText46->Wrap( -1 );
- bSizerFilesRemaining->Add( m_staticText46, 0, wxALIGN_BOTTOM, 5 );
-
- wxBoxSizer* bSizer154;
- bSizer154 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextFilesRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextFilesRemaining->Wrap( -1 );
- m_staticTextFilesRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer154->Add( m_staticTextFilesRemaining, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDataRemaining->Wrap( -1 );
- bSizer154->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM|wxLEFT, 5 );
-
-
- bSizerFilesRemaining->Add( bSizer154, 0, wxALIGN_BOTTOM|wxLEFT, 5 );
-
-
- bSizer157->Add( bSizerFilesRemaining, 0, 0, 5 );
-
-
- bSizer162StretchSpeedAndRemTimeIndependently->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer162StretchSpeedAndRemTimeIndependently->Add( 0, 0, 1, wxEXPAND, 5 );
-
- sSizerSpeed = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText104 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText104->Wrap( -1 );
- sSizerSpeed->Add( m_staticText104, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextSpeed->Wrap( -1 );
- m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- sSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer162StretchSpeedAndRemTimeIndependently->Add( sSizerSpeed, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer42->Add( bSizer162StretchSpeedAndRemTimeIndependently, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer42->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer163;
- bSizer163 = new wxBoxSizer( wxHORIZONTAL );
-
- sSizerTimeRemaining = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextTimeRemFixed = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeRemFixed->Wrap( -1 );
- sSizerTimeRemaining->Add( m_staticTextTimeRemFixed, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextRemTime = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextRemTime->Wrap( -1 );
- m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- sSizerTimeRemaining->Add( m_staticTextRemTime, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer163->Add( sSizerTimeRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer163->Add( 0, 0, 1, wxEXPAND, 5 );
-
- sSizerTimeElapsed = new wxBoxSizer( wxHORIZONTAL );
-
- wxStaticText* m_staticText37;
- m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText37->Wrap( -1 );
- sSizerTimeElapsed->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeElapsed->Wrap( -1 );
- m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- sSizerTimeElapsed->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer163->Add( sSizerTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer42->Add( bSizer163, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer40->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer40 );
- this->Layout();
- bSizer40->Fit( this );
-}
-
-CompareProgressDlgGenerated::~CompareProgressDlgGenerated()
-{
-}
-
-SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
-{
- bSizerRoot = new wxBoxSizer( wxVERTICAL );
-
- bSizer42 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer42->Add( 32, 0, 0, 0, 5 );
-
-
- bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
- bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
- m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextPhase->Wrap( -1 );
- m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
-
- m_animCtrlSyncing = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 32,32 ), wxAC_DEFAULT_STYLE );
- bSizer42->Add( m_animCtrlSyncing, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
-
- bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), wxBU_AUTODRAW );
- m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
-
- bSizer42->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerRoot->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
-
- bSizerStatusText = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatus->Wrap( -1 );
- bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 10 );
-
-
- bSizerStatusText->Add( 0, 5, 0, 0, 5 );
-
-
- bSizerRoot->Add( bSizerStatusText, 0, wxEXPAND, 5 );
-
- wxStaticLine* m_staticlineHeader;
- m_staticlineHeader = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerRoot->Add( m_staticlineHeader, 0, wxEXPAND, 5 );
-
- m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelProgress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
-
- bSizer171 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer171->Add( 10, 0, 0, 0, 5 );
-
- wxBoxSizer* bSizer164;
- bSizer164 = new wxBoxSizer( wxVERTICAL );
-
- m_panelItemsProcessed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer165;
- bSizer165 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText96;
- m_staticText96 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizer165->Add( m_staticText96, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer169;
- bSizer169 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextProcessedObj = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticTextProcessedObj->Wrap( -1 );
- m_staticTextProcessedObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer169->Add( m_staticTextProcessedObj, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextDataProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDataProcessed->Wrap( -1 );
- bSizer169->Add( m_staticTextDataProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer165->Add( bSizer169, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsProcessed->SetSizer( bSizer165 );
- m_panelItemsProcessed->Layout();
- bSizer165->Fit( m_panelItemsProcessed );
- bSizer164->Add( m_panelItemsProcessed, 0, wxEXPAND|wxTOP, 7 );
-
- m_panelItemsRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText97;
- m_staticText97 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText97->Wrap( -1 );
- bSizer166->Add( m_staticText97, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer170;
- bSizer170 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextRemainingObj = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticTextRemainingObj->Wrap( -1 );
- m_staticTextRemainingObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer170->Add( m_staticTextRemainingObj, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextDataRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDataRemaining->Wrap( -1 );
- bSizer170->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer166->Add( bSizer170, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsRemaining->SetSizer( bSizer166 );
- m_panelItemsRemaining->Layout();
- bSizer166->Fit( m_panelItemsRemaining );
- bSizer164->Add( m_panelItemsRemaining, 0, wxTOP|wxEXPAND, 7 );
-
- m_panelTimeRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelTimeRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer167;
- bSizer167 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer167->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText98;
- m_staticText98 = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText98->Wrap( -1 );
- bSizer167->Add( m_staticText98, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_staticTextRemTime = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextRemTime->Wrap( -1 );
- m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer167->Add( m_staticTextRemTime, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer167->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelTimeRemaining->SetSizer( bSizer167 );
- m_panelTimeRemaining->Layout();
- bSizer167->Fit( m_panelTimeRemaining );
- bSizer164->Add( m_panelTimeRemaining, 0, wxTOP|wxEXPAND, 7 );
-
- wxPanel* m_panelTimeElapsed;
- m_panelTimeElapsed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer168;
- bSizer168 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText961;
- m_staticText961 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText961->Wrap( -1 );
- bSizer168->Add( m_staticText961, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_staticTextTimeElapsed = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeElapsed->Wrap( -1 );
- m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer168->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelTimeElapsed->SetSizer( bSizer168 );
- m_panelTimeElapsed->Layout();
- bSizer168->Fit( m_panelTimeElapsed );
- bSizer164->Add( m_panelTimeElapsed, 0, wxTOP|wxEXPAND, 7 );
-
-
- bSizer171->Add( bSizer164, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer171->Add( 10, 0, 0, 0, 5 );
-
- wxBoxSizer* bSizer161;
- bSizer161 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer161->Add( 0, 15, 0, 0, 5 );
-
- m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer161->Add( m_panelGraphBytes, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer161->Add( m_panelGraphItems, 1, wxEXPAND, 5 );
-
-
- bSizer161->Add( 430, 0, 0, 0, 5 );
-
-
- bSizer171->Add( bSizer161, 1, wxEXPAND, 5 );
-
-
- bSizer171->Add( 0, 230, 0, 0, 5 );
-
-
- bSizer173->Add( bSizer171, 1, wxEXPAND, 5 );
-
-
- m_panelProgress->SetSizer( bSizer173 );
- m_panelProgress->Layout();
- bSizer173->Fit( m_panelProgress );
- bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 );
-
- m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH );
-
- bSizerRoot->Add( m_notebookResult, 1, wxEXPAND, 5 );
-
- m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerExecFinished = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText87 = new wxStaticText( this, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText87->Wrap( -1 );
- bSizerExecFinished->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_comboBoxExecFinished = new ExecFinishedBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer160->Add( bSizerExecFinished, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer160->Add( 0, 0, 0, 0, 5 );
-
-
- bSizerStdButtons->Add( bSizer160, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
- m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonClose->SetDefault();
- m_buttonClose->Enable( false );
-
- bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
- m_buttonStop = new wxButton( this, wxID_CANCEL, _("Stop"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonStop, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizerRoot->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizerRoot );
- this->Layout();
- bSizerRoot->Fit( this );
-}
-
-SyncProgressPanelGenerated::~SyncProgressPanelGenerated()
-{
-}
-
-LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
-{
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer179;
- bSizer179 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer153;
- bSizer153 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer154;
- bSizer154 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 );
-
- m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMessages->SetScrollRate( 5, 5 );
- bSizer153->Add( m_gridMessages, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer179->Add( bSizer153, 1, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer179 );
- this->Layout();
- bSizer179->Fit( this );
-
- // Connect Events
- m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnErrors ), NULL, this );
- m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnWarnings ), NULL, this );
- m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnInfo ), NULL, this );
-}
-
-LogPanelGenerated::~LogPanelGenerated()
-{
-}
-
-BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer54;
- bSizer54 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticTextDescr = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDescr->Wrap( 520 );
- bSizer72->Add( m_staticTextDescr, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer54->Add( bSizer72, 0, 0, 5 );
-
- m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 );
-
- m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer180;
- bSizer180 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer171;
- bSizer171 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText82 = new wxStaticText( m_panel35, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText82->Wrap( -1 );
- bSizer171->Add( m_staticText82, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer169;
- bSizer169 = new wxBoxSizer( wxHORIZONTAL );
-
- m_toggleBtnErrorIgnore = new wxToggleButton( m_panel35, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") );
-
- bSizer169->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_toggleBtnErrorPopup = new wxToggleButton( m_panel35, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") );
-
- bSizer169->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_toggleBtnErrorStop = new wxToggleButton( m_panel35, wxID_ANY, _("Stop"), wxDefaultPosition, wxDefaultSize, 0 );
- m_toggleBtnErrorStop->SetToolTip( _("Stop synchronization at first error") );
-
- bSizer169->Add( m_toggleBtnErrorStop, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer171->Add( bSizer169, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer180->Add( bSizer171, 0, wxALL, 5 );
-
- m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer170;
- bSizer170 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxShowProgress = new wxCheckBox( m_panel35, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer170->Add( m_checkBoxShowProgress, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
-
- wxBoxSizer* bSizer179;
- bSizer179 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText81 = new wxStaticText( m_panel35, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText81->Wrap( -1 );
- bSizer179->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_comboBoxExecFinished = new ExecFinishedBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer179->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer170->Add( bSizer179, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer180->Add( bSizer170, 1, wxALL, 5 );
-
-
- bSizer172->Add( bSizer180, 0, wxEXPAND, 5 );
-
- m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer191;
- bSizer191 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxGenerateLogfile = new wxCheckBox( m_panel35, wxID_ANY, _("Save log:"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer191->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxBOTTOM, 5 );
-
- m_panelLogfile = new wxPanel( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer1721;
- bSizer1721 = new wxBoxSizer( wxHORIZONTAL );
-
- m_logfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer1721->Add( m_logfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectLogfileDir->SetToolTip( _("Select a folder") );
-
- bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") );
-
- bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
- m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") );
-
- bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelLogfile->SetSizer( bSizer1721 );
- m_panelLogfile->Layout();
- bSizer1721->Fit( m_panelLogfile );
- bSizer191->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer172->Add( bSizer191, 0, wxEXPAND|wxALL, 10 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panel35, wxID_ANY, _("How can I schedule a batch job?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer172->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- m_panel35->SetSizer( bSizer172 );
- m_panel35->Layout();
- bSizer172->Fit( m_panel35 );
- bSizer54->Add( m_panel35, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_buttonSaveAs = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonSaveAs->SetDefault();
- m_buttonSaveAs->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonSaveAs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer54 );
- this->Layout();
- bSizer54->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) );
- m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this );
- m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this );
- m_toggleBtnErrorStop->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorStop ), NULL, this );
- m_checkBoxGenerateLogfile->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this );
- m_checkBoxLogfilesLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( BatchDlgGenerated::OnHelpScheduleBatch ), NULL, this );
- m_buttonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this );
-}
-
-BatchDlgGenerated::~BatchDlgGenerated()
-{
-}
-
-DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer24;
- bSizer24 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer72->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER );
- m_staticTextHeader->Wrap( -1 );
- bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer24->Add( bSizer72, 0, 0, 5 );
-
- m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 );
-
- m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer185->Add( 60, 0, 0, 0, 5 );
-
- m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 );
-
- m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 480,200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panel31->SetSizer( bSizer185 );
- m_panel31->Layout();
- bSizer185->Fit( m_panel31 );
- bSizer24->Add( m_panel31, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer99;
- bSizer99 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxDeleteBothSides->Hide();
- m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") );
-
- bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxLEFT, 5 );
-
-
- bSizerStdButtons->Add( bSizer99, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonOK->SetDefault();
- m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer24 );
- this->Layout();
- bSizer24->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) );
- m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this );
- m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this );
- m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this );
-}
-
-DeleteDlgGenerated::~DeleteDlgGenerated()
-{
-}
-
-FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer21;
- bSizer21 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapFilter = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer72->Add( m_bitmapFilter, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticText44 = new wxStaticText( this, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticText44->Wrap( 480 );
- bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer21->Add( bSizer72, 0, 0, 5 );
-
- m_staticline17 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer21->Add( m_staticline17, 0, wxEXPAND, 5 );
-
- m_panel38 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel38->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer159;
- bSizer159 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer166->Add( 0, 10, 0, 0, 5 );
-
- wxBoxSizer* bSizer1661;
- bSizer1661 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapInclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
- bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
-
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText78 = new wxStaticText( m_panel38, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText78->Wrap( -1 );
- bSizer173->Add( m_staticText78, 0, 0, 5 );
-
- m_textCtrlInclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- m_textCtrlInclude->SetMinSize( wxSize( 280,-1 ) );
-
- bSizer173->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 5 );
-
-
- bSizer1661->Add( bSizer173, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( bSizer1661, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxLEFT, 5 );
-
- m_staticline22 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 );
-
-
- bSizer166->Add( 0, 10, 0, 0, 5 );
-
- wxBoxSizer* bSizer1651;
- bSizer1651 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapExclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
- bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer189;
- bSizer189 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText77 = new wxStaticText( m_panel38, wxID_ANY, _("Exclude:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText77->Wrap( -1 );
- bSizer189->Add( m_staticText77, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer189->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panel38, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer189->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer174->Add( bSizer189, 0, wxEXPAND, 5 );
-
- m_textCtrlExclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- bSizer174->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
-
-
- bSizer1651->Add( bSizer174, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( bSizer1651, 2, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 );
-
-
- bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_staticline24 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer159->Add( m_staticline24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer167;
- bSizer167 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapFilterDate = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 );
- bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- wxBoxSizer* bSizer165;
- bSizer165 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText79 = new wxStaticText( m_panel38, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText79->Wrap( -1 );
- bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 );
-
- m_spinCtrlTimespan = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer165->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxArrayString m_choiceUnitTimespanChoices;
- m_choiceUnitTimespan = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 );
- m_choiceUnitTimespan->SetSelection( 0 );
- bSizer165->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
-
- m_staticline23 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer168;
- bSizer168 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapFilterSize = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
- bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
-
- wxBoxSizer* bSizer158;
- bSizer158 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText80 = new wxStaticText( m_panel38, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText80->Wrap( -1 );
- bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText101 = new wxStaticText( m_panel38, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText101->Wrap( -1 );
- bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 );
-
- m_spinCtrlMinSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxArrayString m_choiceUnitMinSizeChoices;
- m_choiceUnitMinSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 );
- m_choiceUnitMinSize->SetSelection( 0 );
- bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer163;
- bSizer163 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText102 = new wxStaticText( m_panel38, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText102->Wrap( -1 );
- bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 );
-
- m_spinCtrlMaxSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxArrayString m_choiceUnitMaxSizeChoices;
- m_choiceUnitMaxSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 );
- m_choiceUnitMaxSize->SetSelection( 0 );
- bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer158->Add( bSizer163, 0, wxEXPAND, 5 );
-
-
- bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer168, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
-
-
- bSizer159->Add( bSizer160, 0, wxEXPAND, 5 );
-
-
- m_panel38->SetSizer( bSizer159 );
- m_panel38->Layout();
- bSizer159->Fit( m_panel38 );
- bSizer21->Add( m_panel38, 1, wxEXPAND, 5 );
-
- m_staticline16 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer21->Add( m_staticline16, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonClear = new wxButton( this, wxID_DEFAULT, _("&Clear"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonClear, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
-
- bSizerStdButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonOk->SetDefault();
- m_buttonOk->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOk, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer21->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer21 );
- this->Layout();
- bSizer21->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) );
- m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( FilterDlgGenerated::OnHelpShowExamples ), NULL, this );
- m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
- m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
- m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
- m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
- m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnClear ), NULL, this );
- m_buttonOk->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this );
-}
-
-FilterDlgGenerated::~FilterDlgGenerated()
-{
-}
-
-GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer95;
- bSizer95 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticText44 = new wxStaticText( this, wxID_ANY, _("The following settings are used for all synchronization jobs."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticText44->Wrap( 500 );
- bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer95->Add( bSizer72, 0, 0, 5 );
-
- m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 );
-
- m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer186;
- bSizer186 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer176;
- bSizer176 = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxFailSafe = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxFailSafe->SetValue(true);
- m_checkBoxFailSafe->SetToolTip( _("Copy to a temporary file (*.ffs_tmp) before overwriting target.\nThis guarantees a consistent state even in case of a serious error.") );
-
- bSizer176->Add( m_checkBoxFailSafe, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticText91 = new wxStaticText( m_panel39, wxID_ANY, _("(recommended)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText91->Wrap( -1 );
- m_staticText91->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer176->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer176, 0, wxEXPAND, 5 );
-
- bSizerLockedFiles = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxCopyLocked->SetValue(true);
- m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using the Volume Shadow Copy Service.") );
-
- bSizerLockedFiles->Add( m_checkBoxCopyLocked, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticText92 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText92->Wrap( -1 );
- m_staticText92->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizerLockedFiles->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxCopyPermissions->SetValue(true);
- m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and folder permissions.") );
-
- bSizer178->Add( m_checkBoxCopyPermissions, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_staticText93 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText93->Wrap( -1 );
- m_staticText93->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer178->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer178, 0, wxEXPAND, 5 );
-
-
- bSizer186->Add( bSizer160, 0, wxEXPAND|wxALL, 5 );
-
- m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer188;
- bSizer188 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText95 = new wxStaticText( m_panel39, wxID_ANY, _("Automatic retry on error:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText95->Wrap( -1 );
- bSizer188->Add( m_staticText95, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
-
- wxFlexGridSizer* fgSizer6;
- fgSizer6 = new wxFlexGridSizer( 0, 2, 5, 5 );
- fgSizer6->SetFlexibleDirection( wxBOTH );
- fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_staticText96 = new wxStaticText( m_panel39, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- fgSizer6->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 4 );
- fgSizer6->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextAutoRetryDelay = new wxStaticText( m_panel39, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextAutoRetryDelay->Wrap( -1 );
- fgSizer6->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- fgSizer6->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer188->Add( fgSizer6, 0, wxLEFT, 10 );
-
-
- bSizer186->Add( bSizer188, 0, wxALL, 10 );
-
-
- bSizer166->Add( bSizer186, 0, wxEXPAND, 5 );
-
- m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer166->Add( m_staticline191, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText85->Wrap( -1 );
- bSizer181->Add( m_staticText85, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
-
- m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
-
- // Grid
- m_gridCustomCommand->CreateGrid( 5, 2 );
- m_gridCustomCommand->EnableEditing( true );
- m_gridCustomCommand->EnableGridLines( true );
- m_gridCustomCommand->EnableDragGridSize( false );
- m_gridCustomCommand->SetMargins( 0, 0 );
-
- // Columns
- m_gridCustomCommand->SetColSize( 0, 165 );
- m_gridCustomCommand->SetColSize( 1, 196 );
- m_gridCustomCommand->EnableDragColMove( false );
- m_gridCustomCommand->EnableDragColSize( true );
- m_gridCustomCommand->SetColLabelSize( 20 );
- m_gridCustomCommand->SetColLabelValue( 0, _("Description") );
- m_gridCustomCommand->SetColLabelValue( 1, _("Command line") );
- m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
-
- // Rows
- m_gridCustomCommand->EnableDragRowSize( false );
- m_gridCustomCommand->SetRowLabelSize( 1 );
- m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
-
- // Label Appearance
-
- // Cell Defaults
- m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
- bSizer181->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer193;
- bSizer193 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer193->Add( m_bpButtonAddRow, 0, 0, 5 );
-
- m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer193->Add( m_bpButtonRemoveRow, 0, 0, 5 );
-
-
- bSizer193->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer193->Add( m_hyperlink17, 0, wxLEFT, 5 );
-
-
- bSizer181->Add( bSizer193, 0, wxTOP|wxEXPAND, 5 );
-
-
- bSizer166->Add( bSizer181, 1, wxEXPAND|wxALL, 10 );
-
- m_staticline192 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer166->Add( m_staticline192, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer1881;
- bSizer1881 = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("Restore hidden windows"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer1881->Add( m_buttonResetDialogs, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
-
- m_staticline40 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1881->Add( m_staticline40, 0, wxEXPAND, 5 );
-
-
- bSizer166->Add( bSizer1881, 0, 0, 5 );
-
-
- m_panel39->SetSizer( bSizer166 );
- m_panel39->Layout();
- bSizer166->Fit( m_panel39 );
- bSizer95->Add( m_panel39, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonDefault = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonDefault, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStdButtons->Add( 0, 0, 1, 0, 5 );
-
- m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonOkay->SetDefault();
- m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer95 );
- this->Layout();
- bSizer95->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) );
- m_spinCtrlAutoRetryCount->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnToggleAutoRetryCount ), NULL, this );
- m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this );
- m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( GlobalSettingsDlgGenerated::OnHelpShowExamples ), NULL, this );
- m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this );
- m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this );
- m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this );
-}
-
-GlobalSettingsDlgGenerated::~GlobalSettingsDlgGenerated()
-{
-}
-
-TooltipDialogGenerated::TooltipDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
-
- wxBoxSizer* bSizer158;
- bSizer158 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextMain->Wrap( 600 );
- bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- this->SetSizer( bSizer158 );
- this->Layout();
- bSizer158->Fit( this );
-}
-
-TooltipDialogGenerated::~TooltipDialogGenerated()
-{
-}
-
-SelectTimespanDlgGenerated::SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer96;
- bSizer96 = new wxBoxSizer( wxVERTICAL );
-
- m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer98;
- bSizer98 = new wxBoxSizer( wxHORIZONTAL );
-
- m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
- bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
- bSizer98->Add( m_calendarTo, 0, wxALL, 10 );
-
-
- m_panel35->SetSizer( bSizer98 );
- m_panel35->Layout();
- bSizer98->Fit( m_panel35 );
- bSizer96->Add( m_panel35, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonOkay->SetDefault();
- m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer96 );
- this->Layout();
- bSizer96->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) );
- m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this );
- m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this );
- m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this );
-}
-
-SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated()
-{
-}
-
-AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer31;
- bSizer31 = new wxBoxSizer( wxVERTICAL );
-
- m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer162->Add( m_bitmapLogo, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer162->Add( m_staticline341, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer187;
- bSizer187 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText96 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizer187->Add( m_staticText96, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer171;
- bSizer171 = new wxBoxSizer( wxHORIZONTAL );
-
- m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink11->SetToolTip( _("http://msdn.microsoft.com/library/60k1461a.aspx") );
-
- bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink9->SetToolTip( _("http://www.mingw.org") );
-
- bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink10->SetToolTip( _("http://www.codeblocks.org") );
-
- bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink7->SetToolTip( _("http://www.wxwidgets.org") );
-
- bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink14->SetToolTip( _("http://wxformbuilder.org") );
-
- bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer187->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxHORIZONTAL );
-
- m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zen::Xml"), wxT("http://zenxml.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink15->SetToolTip( _("http://zenxml.sourceforge.net") );
-
- bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink13 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink13->SetToolTip( _("http://www.boost.org") );
-
- bSizer172->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink16->SetToolTip( _("http://astyle.sourceforge.net") );
-
- bSizer172->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink12->SetToolTip( _("http://code.google.com/p/googletest") );
-
- bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink18->SetToolTip( _("http://www.scratchpaper.com") );
-
- bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer187->Add( bSizer172, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer181->Add( bSizer187, 0, wxALL|wxEXPAND, 5 );
-
- m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) );
-
- wxBoxSizer* bSizer183;
- bSizer183 = new wxBoxSizer( wxVERTICAL );
-
- m_panel39 = new wxPanel( m_panelDonate, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel39->SetBackgroundColour( wxColour( 221, 221, 255 ) );
-
- wxBoxSizer* bSizer184;
- bSizer184 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_animCtrlWink = new wxAnimationCtrl( m_panel39, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 48,48 ), wxAC_DEFAULT_STYLE );
- bSizer184->Add( m_animCtrlWink, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText83 = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText83->Wrap( -1 );
- m_staticText83->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_staticText83->SetForegroundColour( wxColour( 0, 0, 0 ) );
-
- bSizer178->Add( m_staticText83, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Donate with PayPal"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
- m_buttonDonate->SetToolTip( _("http://freefilesync.sourceforge.net/donate.php") );
-
- bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer184->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panel39->SetSizer( bSizer184 );
- m_panel39->Layout();
- bSizer184->Fit( m_panel39 );
- bSizer183->Add( m_panel39, 0, wxEXPAND|wxALL, 5 );
-
-
- m_panelDonate->SetSizer( bSizer183 );
- m_panelDonate->Layout();
- bSizer183->Fit( m_panelDonate );
- bSizer181->Add( m_panelDonate, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer186;
- bSizer186 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText94->Wrap( -1 );
- bSizer186->Add( m_staticText94, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmap9 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmap9->SetToolTip( _("Homepage") );
-
- bSizer166->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("freefilesync.sf.net"), wxT("http://freefilesync.sf.net/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
- m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer166->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmap10 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmap10->SetToolTip( _("Email") );
-
- bSizer166->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zenju@gmx.de"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
- m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer166->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- bSizer186->Add( bSizer166, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer181->Add( bSizer186, 0, wxALL|wxEXPAND, 5 );
-
- m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer181->Add( m_staticline34, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText93->Wrap( -1 );
- bSizer185->Add( m_staticText93, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer1671;
- bSizer1671 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmap13 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer1671->Add( m_bitmap13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer185->Add( bSizer1671, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer181->Add( bSizer185, 0, wxALL|wxEXPAND, 5 );
-
-
- bSizer174->Add( bSizer181, 0, 0, 5 );
-
- m_staticline37 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer174->Add( m_staticline37, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer177;
- bSizer177 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText54 = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText54->Wrap( 200 );
- m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer177->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
-
-
- bSizer177->Add( 0, 5, 0, 0, 5 );
-
- m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxVSCROLL );
- m_scrolledWindowTranslators->SetScrollRate( 10, 10 );
- m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_scrolledWindowTranslators->SetMinSize( wxSize( 220,-1 ) );
-
- fgSizerTranslators = new wxFlexGridSizer( 0, 2, 2, 10 );
- fgSizerTranslators->SetFlexibleDirection( wxBOTH );
- fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
-
- m_scrolledWindowTranslators->SetSizer( fgSizerTranslators );
- m_scrolledWindowTranslators->Layout();
- fgSizerTranslators->Fit( m_scrolledWindowTranslators );
- bSizer177->Add( m_scrolledWindowTranslators, 1, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxEXPAND, 5 );
-
-
- bSizer174->Add( bSizer177, 0, wxEXPAND|wxTOP|wxLEFT, 5 );
-
-
- bSizer162->Add( bSizer174, 0, 0, 5 );
-
-
- m_panel41->SetSizer( bSizer162 );
- m_panel41->Layout();
- bSizer162->Fit( m_panel41 );
- bSizer31->Add( m_panel41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonClose->SetDefault();
- bSizerStdButtons->Add( m_buttonClose, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer31->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer31 );
- this->Layout();
- bSizer31->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) );
- m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this );
- m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this );
-}
-
-AboutDlgGenerated::~AboutDlgGenerated()
-{
-}
diff --git a/ui/gui_generated.h b/ui/gui_generated.h
deleted file mode 100644
index 04aed9a9..00000000
--- a/ui/gui_generated.h
+++ /dev/null
@@ -1,880 +0,0 @@
-///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 8 2012)
-// http://www.wxformbuilder.org/
-//
-// PLEASE DO "NOT" EDIT THIS FILE!
-///////////////////////////////////////////////////////////////////////////
-
-#ifndef __GUI_GENERATED_H__
-#define __GUI_GENERATED_H__
-
-#include <wx/artprov.h>
-#include <wx/xrc/xmlres.h>
-#include <wx/intl.h>
-class ExecFinishedBox;
-class FolderHistoryBox;
-class ToggleButton;
-namespace zen { class BitmapTextButton; }
-namespace zen { class Graph2D; }
-namespace zen { class Grid; }
-namespace zen { class TripleSplitter; }
-
-#include <wx/string.h>
-#include <wx/bitmap.h>
-#include <wx/image.h>
-#include <wx/icon.h>
-#include <wx/menu.h>
-#include <wx/gdicmn.h>
-#include <wx/font.h>
-#include <wx/colour.h>
-#include <wx/settings.h>
-#include <wx/button.h>
-#include <wx/bmpbuttn.h>
-#include <wx/sizer.h>
-#include <wx/panel.h>
-#include <wx/stattext.h>
-#include <wx/combobox.h>
-#include <wx/scrolwin.h>
-#include <wx/statbmp.h>
-#include <wx/statline.h>
-#include <wx/textctrl.h>
-#include <wx/checkbox.h>
-#include <wx/listbox.h>
-#include <wx/frame.h>
-#include <wx/tglbtn.h>
-#include <wx/choice.h>
-#include <wx/hyperlink.h>
-#include <wx/dialog.h>
-#include <wx/gauge.h>
-#include <wx/animate.h>
-#include <wx/notebook.h>
-#include <wx/spinctrl.h>
-#include <wx/grid.h>
-#include <wx/calctrl.h>
-
-#include "zen/i18n.h"
-
-///////////////////////////////////////////////////////////////////////////
-
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class MainDialogGenerated
-///////////////////////////////////////////////////////////////////////////////
-class MainDialogGenerated : public wxFrame
-{
-private:
-
-protected:
- wxMenuBar* m_menubar1;
- wxMenu* m_menuFile;
- wxMenuItem* m_menuItemNew;
- wxMenuItem* m_menuItemLoad;
- wxMenuItem* m_menuItemSave;
- wxMenuItem* m_menuItemSaveAs;
- wxMenuItem* m_menuItem7;
- wxMenuItem* m_menuItem10;
- wxMenuItem* m_menuItem11;
- wxMenu* m_menuTools;
- wxMenuItem* m_menuItemGlobSett;
- wxMenu* m_menuLanguages;
- wxMenu* m_menuHelp;
- wxMenuItem* m_menuItemManual;
- wxMenu* m_menuCheckVersion;
- wxMenuItem* m_menuItemCheckVersionNow;
- wxMenuItem* m_menuItemCheckVersionAuto;
- wxMenuItem* m_menuItemAbout;
- wxBoxSizer* bSizerPanelHolder;
- wxPanel* m_panelTopButtons;
- wxBoxSizer* bSizerTopButtons;
- zen::BitmapTextButton* m_buttonCompare;
- zen::BitmapTextButton* m_buttonCancel;
- wxBitmapButton* m_bpButtonCmpConfig;
- wxBitmapButton* m_bpButtonSyncConfig;
- zen::BitmapTextButton* m_buttonSync;
- wxPanel* m_panelDirectoryPairs;
- wxStaticText* m_staticTextResolvedPathL;
- wxBitmapButton* m_bpButtonAddPair;
- wxButton* m_buttonSelectDirLeft;
- wxPanel* m_panelTopMiddle;
- wxBitmapButton* m_bpButtonSwapSides;
- wxStaticText* m_staticTextResolvedPathR;
- wxButton* m_buttonSelectDirRight;
- wxScrolledWindow* m_scrolledWindowFolderPairs;
- wxBoxSizer* bSizerAddFolderPairs;
- zen::Grid* m_gridNavi;
- wxPanel* m_panelCenter;
- zen::TripleSplitter* m_splitterMain;
- zen::Grid* m_gridMainL;
- zen::Grid* m_gridMainC;
- zen::Grid* m_gridMainR;
- wxPanel* m_panelStatusBar;
- wxBoxSizer* bSizerFileStatus;
- wxBoxSizer* bSizerStatusLeft;
- wxBoxSizer* bSizerStatusLeftDirectories;
- wxStaticBitmap* m_bitmapSmallDirectoryLeft;
- wxStaticText* m_staticTextStatusLeftDirs;
- wxBoxSizer* bSizerStatusLeftFiles;
- wxStaticBitmap* m_bitmapSmallFileLeft;
- wxStaticText* m_staticTextStatusLeftFiles;
- wxStaticText* m_staticTextStatusLeftBytes;
- wxStaticLine* m_staticline9;
- wxStaticText* m_staticTextStatusMiddle;
- wxBoxSizer* bSizerStatusRight;
- wxStaticLine* m_staticline10;
- wxBoxSizer* bSizerStatusRightDirectories;
- wxStaticBitmap* m_bitmapSmallDirectoryRight;
- wxStaticText* m_staticTextStatusRightDirs;
- wxBoxSizer* bSizerStatusRightFiles;
- wxStaticBitmap* m_bitmapSmallFileRight;
- wxStaticText* m_staticTextStatusRightFiles;
- wxStaticText* m_staticTextStatusRightBytes;
- wxStaticText* m_staticTextFullStatus;
- wxPanel* m_panelSearch;
- wxBitmapButton* m_bpButtonHideSearch;
- wxStaticText* m_staticText101;
- wxTextCtrl* m_textCtrlSearchTxt;
- wxCheckBox* m_checkBoxMatchCase;
- wxPanel* m_panelConfig;
- wxBoxSizer* bSizerConfig;
- wxBitmapButton* m_bpButtonOpen;
- wxBitmapButton* m_bpButtonSave;
- wxBitmapButton* m_bpButtonBatchJob;
- wxListBox* m_listBoxHistory;
- wxPanel* m_panelFilter;
- wxBitmapButton* m_bpButtonFilter;
- wxCheckBox* m_checkBoxHideExcluded;
- wxPanel* m_panelStatistics;
- wxBoxSizer* bSizer1801;
- wxStaticBitmap* m_bitmapCreateLeft;
- wxStaticText* m_staticTextCreateLeft;
- wxStaticBitmap* m_bitmapUpdateLeft;
- wxStaticText* m_staticTextUpdateLeft;
- wxStaticBitmap* m_bitmapDeleteLeft;
- wxStaticText* m_staticTextDeleteLeft;
- wxStaticBitmap* m_bitmapData;
- wxStaticText* m_staticTextData;
- wxStaticBitmap* m_bitmapDeleteRight;
- wxStaticText* m_staticTextDeleteRight;
- wxStaticBitmap* m_bitmapUpdateRight;
- wxStaticText* m_staticTextUpdateRight;
- wxStaticBitmap* m_bitmapCreateRight;
- wxStaticText* m_staticTextCreateRight;
- wxPanel* m_panelViewFilter;
- wxBoxSizer* bSizerViewFilter;
- ToggleButton* m_bpButtonViewTypeSyncAction;
- ToggleButton* m_bpButtonShowCreateLeft;
- ToggleButton* m_bpButtonShowUpdateLeft;
- ToggleButton* m_bpButtonShowDeleteLeft;
- ToggleButton* m_bpButtonShowLeftOnly;
- ToggleButton* m_bpButtonShowLeftNewer;
- ToggleButton* m_bpButtonShowEqual;
- ToggleButton* m_bpButtonShowDifferent;
- ToggleButton* m_bpButtonShowDoNothing;
- ToggleButton* m_bpButtonShowRightNewer;
- ToggleButton* m_bpButtonShowRightOnly;
- ToggleButton* m_bpButtonShowDeleteRight;
- ToggleButton* m_bpButtonShowUpdateRight;
- ToggleButton* m_bpButtonShowCreateRight;
- ToggleButton* m_bpButtonShowConflict;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnConfigNew( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConfigLoad( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConfigSave( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConfigSaveAs( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuGlobalSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuFindItem( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncSettingsContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHideSearchPanel( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSearchGridEnter( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); }
- virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnLoadFromHistoryDoubleClick( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCfgHistoryRightClick( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnShowExcluded( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleViewType( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnViewButtonRightClick( wxMouseEvent& event ) { event.Skip(); }
-
-
-public:
- wxPanel* m_panelTopLeft;
- wxBitmapButton* m_bpButtonRemovePair;
- FolderHistoryBox* m_directoryLeft;
- wxBitmapButton* m_bpButtonAltCompCfg;
- wxBitmapButton* m_bpButtonLocalFilter;
- wxBitmapButton* m_bpButtonAltSyncCfg;
- wxPanel* m_panelTopRight;
- FolderHistoryBox* m_directoryRight;
- wxBoxSizer* bSizerStatistics;
- wxBoxSizer* bSizerData;
-
- MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 900,600 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
-
- ~MainDialogGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class CmpCfgDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class CmpCfgDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxPanel* m_panel36;
- wxStaticText* m_staticText91;
- wxStaticBitmap* m_bitmapByTime;
- wxToggleButton* m_toggleBtnTimeSize;
- wxStaticBitmap* m_bitmapByContent;
- wxToggleButton* m_toggleBtnContent;
- wxStaticLine* m_staticline33;
- wxStaticText* m_staticText92;
- wxChoice* m_choiceHandleSymlinks;
- wxHyperlinkCtrl* m_hyperlink24;
- wxStaticLine* m_staticline14;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnContent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpComparisonSettings( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE );
- ~CmpCfgDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class SyncCfgDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class SyncCfgDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxPanel* m_panel37;
- wxStaticText* m_staticText86;
- wxToggleButton* m_toggleBtnTwoWay;
- wxStaticText* m_staticTextAutomatic;
- wxToggleButton* m_toggleBtnMirror;
- wxStaticText* m_staticTextMirror;
- wxToggleButton* m_toggleBtnUpdate;
- wxStaticText* m_staticTextUpdate;
- wxToggleButton* m_toggleBtnCustom;
- wxStaticText* m_staticTextCustom;
- wxCheckBox* m_checkBoxDetectMove;
- wxStaticLine* m_staticline32;
- wxStaticText* m_staticText87;
- wxToggleButton* m_toggleBtnPermanent;
- wxToggleButton* m_toggleBtnRecycler;
- wxToggleButton* m_toggleBtnVersioning;
- wxPanel* m_panelVersioning;
- FolderHistoryBox* m_versioningFolder;
- wxButton* m_buttonSelectDirVersioning;
- wxBoxSizer* bSizer192;
- wxStaticText* m_staticText93;
- wxChoice* m_choiceVersioningStyle;
- wxStaticText* m_staticTextNamingCvtPart1;
- wxStaticText* m_staticTextNamingCvtPart2Bold;
- wxStaticText* m_staticTextNamingCvtPart3;
- wxHyperlinkCtrl* m_hyperlink17;
- wxBoxSizer* bSizerExtraConfig;
- wxStaticLine* m_staticline321;
- wxBoxSizer* bSizer179;
- wxStaticText* m_staticText88;
- wxToggleButton* m_toggleBtnErrorIgnore;
- wxToggleButton* m_toggleBtnErrorPopup;
- wxStaticLine* m_staticline36;
- wxBoxSizer* bSizerOnCompletion;
- wxStaticText* m_staticText89;
- ExecFinishedBox* m_comboBoxExecFinished;
- wxStaticLine* m_staticline31;
- wxBoxSizer* bSizerConfig;
- wxStaticText* m_staticTextHeaderCategory1;
- wxStaticText* m_staticTextHeaderAction1;
- wxStaticBitmap* m_bitmapDatabase;
- wxBoxSizer* sbSizerSyncDirections;
- wxBoxSizer* bSizerLeftOnly;
- wxStaticBitmap* m_bitmapLeftOnly;
- wxBitmapButton* m_bpButtonLeftOnly;
- wxBoxSizer* bSizerRightOnly;
- wxStaticBitmap* m_bitmapRightOnly;
- wxBitmapButton* m_bpButtonRightOnly;
- wxBoxSizer* bSizerLeftNewer;
- wxStaticBitmap* m_bitmapLeftNewer;
- wxBitmapButton* m_bpButtonLeftNewer;
- wxBoxSizer* bSizerRightNewer;
- wxStaticBitmap* m_bitmapRightNewer;
- wxBitmapButton* m_bpButtonRightNewer;
- wxBoxSizer* bSizerDifferent;
- wxStaticBitmap* m_bitmapDifferent;
- wxBitmapButton* m_bpButtonDifferent;
- wxBoxSizer* bSizerConflict;
- wxStaticBitmap* m_bitmapConflict;
- wxBitmapButton* m_bpButtonConflict;
- wxStaticLine* m_staticline15;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOK;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncTwoWay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleDetectMovedFiles( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDeletionRecycler( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnParameterChange( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~SyncCfgDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class SyncConfirmationDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class SyncConfirmationDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxStaticBitmap* m_bitmapSync;
- wxStaticText* m_staticTextHeader;
- wxStaticLine* m_staticline371;
- wxPanel* m_panelStatistics;
- wxStaticLine* m_staticline38;
- wxStaticText* m_staticText84;
- wxStaticText* m_staticTextVariant;
- wxStaticLine* m_staticline14;
- wxStaticText* m_staticText83;
- wxStaticBitmap* m_bitmapCreateLeft;
- wxStaticBitmap* m_bitmapUpdateLeft;
- wxStaticBitmap* m_bitmapDeleteLeft;
- wxStaticBitmap* m_bitmapData;
- wxStaticBitmap* m_bitmapDeleteRight;
- wxStaticBitmap* m_bitmapUpdateRight;
- wxStaticBitmap* m_bitmapCreateRight;
- wxStaticText* m_staticTextCreateLeft;
- wxStaticText* m_staticTextUpdateLeft;
- wxStaticText* m_staticTextDeleteLeft;
- wxStaticText* m_staticTextData;
- wxStaticText* m_staticTextDeleteRight;
- wxStaticText* m_staticTextUpdateRight;
- wxStaticText* m_staticTextCreateRight;
- wxStaticLine* m_staticline12;
- wxCheckBox* m_checkBoxDontShowAgain;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonStartSync;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~SyncConfirmationDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class FolderPairPanelGenerated
-///////////////////////////////////////////////////////////////////////////////
-class FolderPairPanelGenerated : public wxPanel
-{
-private:
-
-protected:
- wxButton* m_buttonSelectDirLeft;
- wxButton* m_buttonSelectDirRight;
-
-public:
- wxPanel* m_panelLeft;
- wxBitmapButton* m_bpButtonRemovePair;
- FolderHistoryBox* m_directoryLeft;
- wxPanel* m_panel20;
- wxBitmapButton* m_bpButtonAltCompCfg;
- wxBitmapButton* m_bpButtonLocalFilter;
- wxBitmapButton* m_bpButtonAltSyncCfg;
- wxPanel* m_panelRight;
- FolderHistoryBox* m_directoryRight;
-
- FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
- ~FolderPairPanelGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class CompareProgressDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class CompareProgressDlgGenerated : public wxPanel
-{
-private:
-
-protected:
- wxTextCtrl* m_textCtrlStatus;
- wxGauge* m_gauge2;
- wxBoxSizer* bSizer42;
- wxBoxSizer* bSizerFilesFound;
- wxStaticText* m_staticText321;
- wxStaticText* m_staticTextScanned;
- wxBoxSizer* bSizerFilesRemaining;
- wxStaticText* m_staticText46;
- wxStaticText* m_staticTextFilesRemaining;
- wxStaticText* m_staticTextDataRemaining;
- wxBoxSizer* sSizerSpeed;
- wxStaticText* m_staticText104;
- wxStaticText* m_staticTextSpeed;
- wxBoxSizer* sSizerTimeRemaining;
- wxStaticText* m_staticTextTimeRemFixed;
- wxStaticText* m_staticTextRemTime;
- wxBoxSizer* sSizerTimeElapsed;
- wxStaticText* m_staticTextTimeElapsed;
-
-public:
-
- CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxRAISED_BORDER );
- ~CompareProgressDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class SyncProgressPanelGenerated
-///////////////////////////////////////////////////////////////////////////////
-class SyncProgressPanelGenerated : public wxPanel
-{
-private:
-
-protected:
- wxBoxSizer* bSizer42;
- wxBoxSizer* bSizer171;
- wxStaticText* m_staticText87;
-
-public:
- wxBoxSizer* bSizerRoot;
- wxStaticBitmap* m_bitmapStatus;
- wxStaticText* m_staticTextPhase;
- wxAnimationCtrl* m_animCtrlSyncing;
- wxBitmapButton* m_bpButtonMinimizeToTray;
- wxBoxSizer* bSizerStatusText;
- wxStaticText* m_staticTextStatus;
- wxPanel* m_panelProgress;
- wxPanel* m_panelItemsProcessed;
- wxStaticText* m_staticTextProcessedObj;
- wxStaticText* m_staticTextDataProcessed;
- wxPanel* m_panelItemsRemaining;
- wxStaticText* m_staticTextRemainingObj;
- wxStaticText* m_staticTextDataRemaining;
- wxPanel* m_panelTimeRemaining;
- wxStaticText* m_staticTextRemTime;
- wxStaticText* m_staticTextTimeElapsed;
- zen::Graph2D* m_panelGraphBytes;
- zen::Graph2D* m_panelGraphItems;
- wxNotebook* m_notebookResult;
- wxStaticLine* m_staticlineFooter;
- wxBoxSizer* bSizerStdButtons;
- wxBoxSizer* bSizerExecFinished;
- ExecFinishedBox* m_comboBoxExecFinished;
- wxButton* m_buttonClose;
- wxButton* m_buttonPause;
- wxButton* m_buttonStop;
-
- SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
- ~SyncProgressPanelGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class LogPanelGenerated
-///////////////////////////////////////////////////////////////////////////////
-class LogPanelGenerated : public wxPanel
-{
-private:
-
-protected:
- ToggleButton* m_bpButtonErrors;
- ToggleButton* m_bpButtonWarnings;
- ToggleButton* m_bpButtonInfo;
- wxStaticLine* m_staticline13;
- zen::Grid* m_gridMessages;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnErrors( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnWarnings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnInfo( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
- ~LogPanelGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class BatchDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class BatchDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxStaticBitmap* m_bitmapBatchJob;
- wxStaticText* m_staticTextDescr;
- wxStaticLine* m_staticline18;
- wxPanel* m_panel35;
- wxStaticText* m_staticText82;
- wxToggleButton* m_toggleBtnErrorIgnore;
- wxToggleButton* m_toggleBtnErrorPopup;
- wxToggleButton* m_toggleBtnErrorStop;
- wxStaticLine* m_staticline26;
- wxCheckBox* m_checkBoxShowProgress;
- wxStaticText* m_staticText81;
- ExecFinishedBox* m_comboBoxExecFinished;
- wxStaticLine* m_staticline25;
- wxCheckBox* m_checkBoxGenerateLogfile;
- wxPanel* m_panelLogfile;
- wxButton* m_buttonSelectLogfileDir;
- wxCheckBox* m_checkBoxLogfilesLimit;
- wxSpinCtrl* m_spinCtrlLogfileLimit;
- wxHyperlinkCtrl* m_hyperlink17;
- wxStaticLine* m_staticline13;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonSaveAs;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnErrorStop( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleGenerateLogfile( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpScheduleBatch( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
- FolderHistoryBox* m_logfileDir;
-
- BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as Batch Job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
- ~BatchDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class DeleteDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class DeleteDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxStaticBitmap* m_bitmapDeleteType;
- wxStaticText* m_staticTextHeader;
- wxStaticLine* m_staticline91;
- wxPanel* m_panel31;
- wxStaticLine* m_staticline42;
- wxTextCtrl* m_textCtrlFileList;
- wxStaticLine* m_staticline9;
- wxBoxSizer* bSizerStdButtons;
- wxCheckBox* m_checkBoxUseRecycler;
- wxCheckBox* m_checkBoxDeleteBothSides;
- wxButton* m_buttonOK;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDelOnBothSides( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
- ~DeleteDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class FilterDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class FilterDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxStaticBitmap* m_bitmapFilter;
- wxStaticText* m_staticText44;
- wxStaticLine* m_staticline17;
- wxPanel* m_panel38;
- wxStaticBitmap* m_bitmapInclude;
- wxStaticText* m_staticText78;
- wxTextCtrl* m_textCtrlInclude;
- wxStaticLine* m_staticline22;
- wxStaticBitmap* m_bitmapExclude;
- wxStaticText* m_staticText77;
- wxHyperlinkCtrl* m_hyperlink17;
- wxTextCtrl* m_textCtrlExclude;
- wxStaticLine* m_staticline24;
- wxStaticBitmap* m_bitmapFilterDate;
- wxStaticText* m_staticText79;
- wxSpinCtrl* m_spinCtrlTimespan;
- wxChoice* m_choiceUnitTimespan;
- wxStaticLine* m_staticline23;
- wxStaticBitmap* m_bitmapFilterSize;
- wxStaticText* m_staticText80;
- wxStaticText* m_staticText101;
- wxSpinCtrl* m_spinCtrlMinSize;
- wxChoice* m_choiceUnitMinSize;
- wxStaticText* m_staticText102;
- wxSpinCtrl* m_spinCtrlMaxSize;
- wxChoice* m_choiceUnitMaxSize;
- wxStaticLine* m_staticline16;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonClear;
- wxButton* m_buttonOk;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnClear( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
- ~FilterDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class GlobalSettingsDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class GlobalSettingsDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxStaticBitmap* m_bitmapSettings;
- wxStaticText* m_staticText44;
- wxStaticLine* m_staticline20;
- wxPanel* m_panel39;
- wxCheckBox* m_checkBoxFailSafe;
- wxStaticText* m_staticText91;
- wxBoxSizer* bSizerLockedFiles;
- wxCheckBox* m_checkBoxCopyLocked;
- wxStaticText* m_staticText92;
- wxCheckBox* m_checkBoxCopyPermissions;
- wxStaticText* m_staticText93;
- wxStaticLine* m_staticline39;
- wxStaticText* m_staticText95;
- wxStaticText* m_staticText96;
- wxSpinCtrl* m_spinCtrlAutoRetryCount;
- wxStaticText* m_staticTextAutoRetryDelay;
- wxSpinCtrl* m_spinCtrlAutoRetryDelay;
- wxStaticLine* m_staticline191;
- wxStaticText* m_staticText85;
- wxGrid* m_gridCustomCommand;
- wxBitmapButton* m_bpButtonAddRow;
- wxBitmapButton* m_bpButtonRemoveRow;
- wxHyperlinkCtrl* m_hyperlink17;
- wxStaticLine* m_staticline192;
- zen::BitmapTextButton* m_buttonResetDialogs;
- wxStaticLine* m_staticline40;
- wxStaticLine* m_staticline36;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonDefault;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnToggleAutoRetryCount( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
- ~GlobalSettingsDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class TooltipDialogGenerated
-///////////////////////////////////////////////////////////////////////////////
-class TooltipDialogGenerated : public wxDialog
-{
-private:
-
-protected:
-
-public:
- wxStaticBitmap* m_bitmapLeft;
- wxStaticText* m_staticTextMain;
-
- TooltipDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~TooltipDialogGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class SelectTimespanDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class SelectTimespanDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxPanel* m_panel35;
- wxCalendarCtrl* m_calendarFrom;
- wxCalendarCtrl* m_calendarTo;
- wxStaticLine* m_staticline21;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); }
- virtual void OnChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Time Span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~SelectTimespanDlgGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class AboutDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class AboutDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxPanel* m_panel41;
- wxStaticBitmap* m_bitmapLogo;
- wxStaticLine* m_staticline341;
- wxStaticText* m_staticText96;
- wxHyperlinkCtrl* m_hyperlink11;
- wxHyperlinkCtrl* m_hyperlink9;
- wxHyperlinkCtrl* m_hyperlink10;
- wxHyperlinkCtrl* m_hyperlink7;
- wxHyperlinkCtrl* m_hyperlink14;
- wxHyperlinkCtrl* m_hyperlink15;
- wxHyperlinkCtrl* m_hyperlink13;
- wxHyperlinkCtrl* m_hyperlink16;
- wxHyperlinkCtrl* m_hyperlink12;
- wxHyperlinkCtrl* m_hyperlink18;
- wxPanel* m_panelDonate;
- wxPanel* m_panel39;
- wxAnimationCtrl* m_animCtrlWink;
- wxStaticText* m_staticText83;
- wxButton* m_buttonDonate;
- wxStaticText* m_staticText94;
- wxStaticBitmap* m_bitmap9;
- wxHyperlinkCtrl* m_hyperlink1;
- wxStaticBitmap* m_bitmap10;
- wxHyperlinkCtrl* m_hyperlink2;
- wxStaticLine* m_staticline34;
- wxStaticText* m_staticText93;
- wxStaticBitmap* m_bitmap13;
- wxHyperlinkCtrl* m_hyperlink5;
- wxStaticLine* m_staticline37;
- wxStaticText* m_staticText54;
- wxScrolledWindow* m_scrolledWindowTranslators;
- wxFlexGridSizer* fgSizerTranslators;
- wxStaticLine* m_staticline36;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonClose;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
-
-
-public:
-
- AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~AboutDlgGenerated();
-
-};
-
-#endif //__GUI_GENERATED_H__
diff --git a/wx+/font_size.h b/wx+/font_size.h
index 7bfc62fc..4639d194 100644
--- a/wx+/font_size.h
+++ b/wx+/font_size.h
@@ -48,7 +48,7 @@ void setMainInstructionFont(wxWindow& control)
{
wxFont font = control.GetFont();
#ifdef ZEN_WIN //http://msdn.microsoft.com/de-DE/library/windows/desktop/aa974176#fonts
- font.SetPointSize(numeric::round(wxNORMAL_FONT->GetPointSize() * 4.0 / 3));
+ font.SetPointSize(wxNORMAL_FONT->GetPointSize() * 4 / 3); //integer round down
//get main instruction color: don't hard-code, respect accessibility!
typedef HTHEME (WINAPI* OpenThemeDataFun )(HWND hwnd, LPCWSTR pszClassList);
diff --git a/wx+/graph.cpp b/wx+/graph.cpp
index 2f5b3775..9298b10b 100644
--- a/wx+/graph.cpp
+++ b/wx+/graph.cpp
@@ -721,13 +721,13 @@ void Graph2D::render(wxDC& dc) const
*low = *high = (*low + *high) / 2;
};
- for (auto it = allSelections.begin(); it != allSelections.end(); ++it)
+ for (const SelectionBlock& sel : allSelections)
{
//harmonize with active mouse selection above
- double screenFromX = cvrtX.realToScreen(it->from.x);
- double screenFromY = cvrtY.realToScreen(it->from.y);
- double screenToX = cvrtX.realToScreen(it->to.x);
- double screenToY = cvrtY.realToScreen(it->to.y);
+ double screenFromX = cvrtX.realToScreen(sel.from.x);
+ double screenFromY = cvrtY.realToScreen(sel.from.y);
+ double screenToX = cvrtX.realToScreen(sel.to.x);
+ double screenToY = cvrtY.realToScreen(sel.to.y);
shrink(&screenFromX, &screenToX);
shrink(&screenFromY, &screenToY);
diff --git a/wx+/grid.cpp b/wx+/grid.cpp
index 184302bf..87f81dda 100644
--- a/wx+/grid.cpp
+++ b/wx+/grid.cpp
@@ -297,6 +297,7 @@ protected:
SetToolTip(new wxToolTip(L"a b\n\
a b")); //ugly, but is working (on Windows)
tt = GetToolTip(); //should be bound by now
+ assert(tt);
if (tt)
tt->SetTip(text);
}
@@ -542,8 +543,8 @@ namespace
class ColumnResizing
{
public:
- ColumnResizing(wxWindow& wnd, size_t col, size_t compPos, int startWidth, int clientPosX) :
- wnd_(wnd), col_(col), compPos_(compPos), startWidth_(startWidth), clientPosX_(clientPosX)
+ ColumnResizing(wxWindow& wnd, size_t col, int startWidth, int clientPosX) :
+ wnd_(wnd), col_(col), startWidth_(startWidth), clientPosX_(clientPosX)
{
wnd_.CaptureMouse();
}
@@ -554,14 +555,12 @@ public:
}
size_t getColumn () const { return col_; }
- size_t getComponentPos() const { return compPos_; }
int getStartWidth () const { return startWidth_; }
int getStartPosX () const { return clientPosX_; }
private:
wxWindow& wnd_;
const size_t col_;
- const size_t compPos_;
const int startWidth_;
const int clientPosX_;
};
@@ -570,10 +569,9 @@ private:
class ColumnMove
{
public:
- ColumnMove(wxWindow& wnd, size_t colFrom, size_t compPos, int clientPosX) :
+ ColumnMove(wxWindow& wnd, size_t colFrom, int clientPosX) :
wnd_(wnd),
colFrom_(colFrom),
- compPos_(compPos),
colTo_(colFrom),
clientPosX_(clientPosX),
singleClick_(true) { wnd_.CaptureMouse(); }
@@ -581,7 +579,6 @@ public:
size_t getColumnFrom() const { return colFrom_; }
size_t& refColumnTo() { return colTo_; }
- size_t getComponentPos() const { return compPos_; }
int getStartPosX () const { return clientPosX_; }
bool isRealMove() const { return !singleClick_; }
@@ -590,7 +587,6 @@ public:
private:
wxWindow& wnd_;
const size_t colFrom_;
- const size_t compPos_;
size_t colTo_;
const int clientPosX_;
bool singleClick_;
@@ -625,36 +621,35 @@ private:
wxPoint labelAreaTL(refParent().CalcScrolledPosition(wxPoint(0, 0)).x, 0); //client coordinates
- std::vector<std::vector<ColumnWidth>> compAbsWidths = refParent().getColWidths(); //resolve stretched widths
- for (auto iterComp = compAbsWidths.begin(); iterComp != compAbsWidths.end(); ++iterComp)
- for (auto iterCol = iterComp->begin(); iterCol != iterComp->end(); ++iterCol)
- {
- const size_t col = iterCol - iterComp->begin();
- const int width = iterCol->width_; //don't use unsigned for calculations!
-
- if (labelAreaTL.x > rect.GetRight())
- return; //done
- if (labelAreaTL.x + width > rect.x)
- drawColumnLabel(dc, wxRect(labelAreaTL, wxSize(width, colLabelHeight)), col, iterCol->type_, iterComp - compAbsWidths.begin());
- labelAreaTL.x += width;
- }
+ std::vector<ColumnWidth> absWidths = refParent().getColWidths(); //resolve stretched widths
+ for (auto it = absWidths.begin(); it != absWidths.end(); ++it)
+ {
+ const size_t col = it - absWidths.begin();
+ const int width = it->width_; //don't use unsigned for calculations!
+
+ if (labelAreaTL.x > rect.GetRight())
+ return; //done
+ if (labelAreaTL.x + width > rect.x)
+ drawColumnLabel(dc, wxRect(labelAreaTL, wxSize(width, colLabelHeight)), col, it->type_);
+ labelAreaTL.x += width;
+ }
}
- void drawColumnLabel(wxDC& dc, const wxRect& rect, size_t col, ColumnType colType, size_t compPos)
+ void drawColumnLabel(wxDC& dc, const wxRect& rect, size_t col, ColumnType colType)
{
- if (auto dataView = refParent().getDataProvider(compPos))
+ if (auto dataView = refParent().getDataProvider())
{
- const bool isHighlighted = activeResizing ? col == activeResizing->getColumn () && compPos == activeResizing->getComponentPos() : //highlight column on mouse-over
- activeMove ? col == activeMove ->getColumnFrom() && compPos == activeMove ->getComponentPos() :
- highlight ? col == highlight->first && compPos == highlight->second :
+ const bool isHighlighted = activeResizing ? col == activeResizing->getColumn () : //highlight column on mouse-over
+ activeMove ? col == activeMove ->getColumnFrom() :
+ highlightCol ? col == *highlightCol :
false;
RecursiveDcClipper clip(dc, rect);
dataView->renderColumnLabel(refParent(), dc, rect, colType, isHighlighted);
//draw move target location
- if (refParent().columnMoveAllowed(compPos))
- if (activeMove && activeMove->isRealMove() && activeMove->getComponentPos() == compPos)
+ if (refParent().allowColumnMove)
+ if (activeMove && activeMove->isRealMove())
{
if (col + 1 == activeMove->refColumnTo()) //handle pos 1, 2, .. up to "at end" position
dc.GradientFillLinear(wxRect(rect.GetTopRight(), rect.GetBottomRight() + wxPoint(-2, 0)), COLOR_LABEL_GRADIENT_FROM, *wxBLUE, wxSOUTH);
@@ -677,11 +672,11 @@ private:
if (action->wantResize)
{
if (!event.LeftDClick()) //double-clicks never seem to arrive here; why is this checked at all???
- if (Opt<int> colWidth = refParent().getColWidth(action->col, action->compPos))
- activeResizing.reset(new ColumnResizing(*this, action->col, action->compPos, *colWidth, event.GetPosition().x));
+ if (Opt<int> colWidth = refParent().getColWidth(action->col))
+ activeResizing.reset(new ColumnResizing(*this, action->col, *colWidth, event.GetPosition().x));
}
else //a move or single click
- activeMove.reset(new ColumnMove(*this, action->col, action->compPos, event.GetPosition().x));
+ activeMove.reset(new ColumnMove(*this, action->col, event.GetPosition().x));
}
event.Skip();
}
@@ -692,10 +687,9 @@ private:
if (activeMove)
{
- const size_t compPos = activeMove->getComponentPos();
if (activeMove->isRealMove())
{
- if (refParent().columnMoveAllowed(compPos))
+ if (refParent().allowColumnMove)
{
const auto colFrom = activeMove->getColumnFrom();
auto colTo = activeMove->refColumnTo();
@@ -703,13 +697,13 @@ private:
if (colTo > colFrom) //simulate "colFrom" deletion
--colTo;
- refParent().moveColumn(colFrom, colTo, compPos);
+ refParent().moveColumn(colFrom, colTo);
}
}
else //notify single label click
{
- if (const Opt<ColumnType> colType = refParent().colToType(activeMove->getColumnFrom(), compPos))
- sendEventNow(GridClickEvent(EVENT_GRID_COL_LABEL_MOUSE_LEFT, event, -1, *colType, compPos));
+ if (const Opt<ColumnType> colType = refParent().colToType(activeMove->getColumnFrom()))
+ sendEventNow(GridClickEvent(EVENT_GRID_COL_LABEL_MOUSE_LEFT, event, -1, *colType));
}
activeMove.reset();
}
@@ -733,10 +727,10 @@ private:
if (action->wantResize)
{
//auto-size visible range on double-click
- const int bestWidth = refParent().getBestColumnSize(action->col, action->compPos); //return -1 on error
+ const int bestWidth = refParent().getBestColumnSize(action->col); //return -1 on error
if (bestWidth >= 0)
{
- refParent().setColWidthAndNotify(bestWidth, action->col, action->compPos);
+ refParent().setColumnWidth(bestWidth, action->col, ALLOW_GRID_EVENT);
refParent().Refresh(); //refresh main grid as well!
}
}
@@ -748,16 +742,15 @@ private:
if (activeResizing)
{
const auto col = activeResizing->getColumn();
- const auto compPos = activeResizing->getComponentPos();
const int newWidth = activeResizing->getStartWidth() + event.GetPosition().x - activeResizing->getStartPosX();
//set width tentatively
- refParent().setColWidthAndNotify(newWidth, col, compPos);
+ refParent().setColumnWidth(newWidth, col, ALLOW_GRID_EVENT);
//check if there's a small gap after last column, if yes, fill it
int gapWidth = GetClientSize().GetWidth() - refParent().getColWidthsSum(GetClientSize().GetWidth());
if (std::abs(gapWidth) < COLUMN_FILL_GAP_TOLERANCE)
- refParent().setColWidthAndNotify(newWidth + gapWidth, col, compPos);
+ refParent().setColumnWidth(newWidth + gapWidth, col, ALLOW_GRID_EVENT);
refParent().Refresh(); //refresh columns on main grid as well!
}
@@ -768,7 +761,7 @@ private:
{
activeMove->setRealMove();
- const auto col = refParent().clientPosToMoveTargetColumn(event.GetPosition(), activeMove->getComponentPos());
+ const ptrdiff_t col = refParent().clientPosToMoveTargetColumn(event.GetPosition());
if (col >= 0)
activeMove->refColumnTo() = col;
}
@@ -777,7 +770,7 @@ private:
{
if (const Opt<ColAction> action = refParent().clientPosToColumnAction(event.GetPosition()))
{
- highlight.reset(new std::pair<size_t, size_t>(action->col, action->compPos));
+ highlightCol.reset(new size_t(action->col));
if (action->wantResize)
SetCursor(wxCURSOR_SIZEWE); //set window-local only! :)
@@ -786,7 +779,7 @@ private:
}
else
{
- highlight.reset();
+ highlightCol.reset();
SetCursor(*wxSTANDARD_CURSOR);
}
}
@@ -795,11 +788,9 @@ private:
const wxString toolTip = [&]() -> wxString
{
const wxPoint absPos = refParent().CalcUnscrolledPosition(event.GetPosition());
- if (const auto colInfo = refParent().getColumnAtPos(absPos.x)) //returns (column type, compPos)
- {
- if (auto prov = refParent().getDataProvider(colInfo->second))
- return prov->getToolTip(colInfo->first);
- }
+ if (const Opt<ColumnType> ct = refParent().getColumnAtPos(absPos.x))
+ if (auto prov = refParent().getDataProvider())
+ return prov->getToolTip(*ct);
return wxString();
}();
setToolTip(toolTip);
@@ -810,7 +801,7 @@ private:
virtual void onLeaveWindow(wxMouseEvent& event)
{
- highlight.reset(); //wxEVT_LEAVE_WINDOW does not respect mouse capture! -> however highlight is drawn unconditionally during move/resize!
+ highlightCol.reset(); //wxEVT_LEAVE_WINDOW does not respect mouse capture! -> however highlight is drawn unconditionally during move/resize!
Refresh();
event.Skip();
}
@@ -819,15 +810,15 @@ private:
{
if (const Opt<ColAction> action = refParent().clientPosToColumnAction(event.GetPosition()))
{
- if (const Opt<ColumnType> colType = refParent().colToType(action->col, action->compPos))
- sendEventNow(GridClickEvent(EVENT_GRID_COL_LABEL_MOUSE_RIGHT, event, -1, *colType, action->compPos)); //notify right click
+ if (const Opt<ColumnType> colType = refParent().colToType(action->col))
+ sendEventNow(GridClickEvent(EVENT_GRID_COL_LABEL_MOUSE_RIGHT, event, -1, *colType)); //notify right click
}
event.Skip();
}
std::unique_ptr<ColumnResizing> activeResizing;
std::unique_ptr<ColumnMove> activeMove;
- std::unique_ptr<std::pair<size_t, size_t>> highlight; //(column, component) mouse-over
+ std::unique_ptr<size_t> highlightCol; //column during mouse-over
};
//----------------------------------------------------------------------------------------------------------------
@@ -893,13 +884,13 @@ public:
}
}
- void setCursor(size_t row, size_t compPos)
+ void setCursor(size_t row)
{
- cursor = std::make_pair(row, compPos);
+ cursorRow = row;
activeSelection.reset(); //e.g. user might search with F3 while holding down left mouse button
selectionAnchor = row;
}
- std::pair<size_t, size_t> getCursor() const { return cursor; } // (row, component position)
+ size_t getCursor() const { return cursorRow; }
private:
virtual void render(wxDC& dc, const wxRect& rect)
@@ -924,27 +915,25 @@ private:
wxPoint cellAreaTL(refParent().CalcScrolledPosition(wxPoint(0, 0))); //client coordinates
- std::vector<std::vector<ColumnWidth>> compAbsWidths = refParent().getColWidths(); //resolve stretched widths
- for (auto iterComp = compAbsWidths.begin(); iterComp != compAbsWidths.end(); ++iterComp)
+ std::vector<ColumnWidth> absWidths = refParent().getColWidths(); //resolve stretched widths
{
- int compWidth = 0;
- for (const ColumnWidth& cw : *iterComp)
- compWidth += cw.width_;
+ int totalWidth = 0;
+ for (const ColumnWidth& cw : absWidths)
+ totalWidth += cw.width_;
- const size_t compPos = iterComp - compAbsWidths.begin();
- if (auto prov = refParent().getDataProvider(compPos))
+ if (auto prov = refParent().getDataProvider())
{
//draw background lines
for (int row = rowFirst; row < rowLast; ++row)
{
- const wxRect rowRect(cellAreaTL + wxPoint(0, row * rowHeight), wxSize(compWidth, rowHeight));
+ const wxRect rowRect(cellAreaTL + wxPoint(0, row * rowHeight), wxSize(totalWidth, rowHeight));
RecursiveDcClipper dummy2(dc, rowRect); //solve issues with drawBackground() painting in area outside of rect
//(which is not also refreshed by renderCell()) -> keep small scope!
- prov->renderRowBackgound(dc, rowRect, row, refParent().IsThisEnabled(), drawAsSelected(row, compPos));
+ prov->renderRowBackgound(dc, rowRect, row, refParent().IsThisEnabled(), drawAsSelected(row));
}
//draw single cells, column by column
- for (const ColumnWidth& cw : *iterComp)
+ for (const ColumnWidth& cw : absWidths)
{
if (cellAreaTL.x > rect.GetRight())
return; //done
@@ -955,27 +944,25 @@ private:
const wxRect cellRect(cellAreaTL.x, cellAreaTL.y + row * rowHeight, cw.width_, rowHeight);
RecursiveDcClipper clip(dc, cellRect);
- prov->renderCell(dc, cellRect, row, cw.type_, drawAsSelected(row, compPos));
+ prov->renderCell(dc, cellRect, row, cw.type_, drawAsSelected(row));
}
cellAreaTL.x += cw.width_;
}
}
- else
- cellAreaTL.x += compWidth;
}
}
- bool drawAsSelected(size_t row, size_t compPos) const
+ bool drawAsSelected(size_t row) const
{
if (activeSelection) //check if user is currently selecting with mouse
{
const size_t rowFrom = std::min(activeSelection->getStartRow(), activeSelection->getCurrentRow());
const size_t rowTo = std::max(activeSelection->getStartRow(), activeSelection->getCurrentRow());
- if (compPos == activeSelection->getComponentPos() && rowFrom <= row && row <= rowTo)
+ if (rowFrom <= row && row <= rowTo)
return activeSelection->isPositiveSelect(); //overwrite default
}
- return refParent().isSelected(row, compPos);
+ return refParent().isSelected(row);
}
virtual void onMouseLeftDown (wxMouseEvent& event) { onMouseDown(event); }
@@ -989,12 +976,10 @@ private:
const auto row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
if (row >= 0)
{
- const auto colInfo = refParent().getColumnAtPos(absPos.x); //returns (column type, compPos)
-
- const ColumnType colType = colInfo ? colInfo->first : DUMMY_COLUMN_TYPE;
- const ptrdiff_t compPos = colInfo ? colInfo->second : -1;
+ const Opt<ColumnType> ct = refParent().getColumnAtPos(absPos.x);
+ const ColumnType colType = ct ? *ct : DUMMY_COLUMN_TYPE;
//client is interested in all double-clicks, even those outside of the grid!
- sendEventNow(GridClickEvent(EVENT_GRID_MOUSE_LEFT_DOUBLE, event, row, colType, compPos));
+ sendEventNow(GridClickEvent(EVENT_GRID_MOUSE_LEFT_DOUBLE, event, row, colType));
}
event.Skip();
}
@@ -1008,34 +993,28 @@ private:
const ptrdiff_t row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
if (row >= 0)
{
- const auto colInfo = refParent().getColumnAtPos(absPos.x); //returns (column type, compPos)
- const ColumnType colType = colInfo ? colInfo->first : DUMMY_COLUMN_TYPE;
- const ptrdiff_t compPos = colInfo ? colInfo->second : -1;
+ const Opt<ColumnType> ct = refParent().getColumnAtPos(absPos.x);
+ const ColumnType colType = ct ? *ct : DUMMY_COLUMN_TYPE;
- if (!event.RightDown() || !refParent().isSelected(row, compPos)) //do NOT start a new selection if user right-clicks on a selected area!
+ if (!event.RightDown() || !refParent().isSelected(row)) //do NOT start a new selection if user right-clicks on a selected area!
{
if (event.ControlDown())
- {
- if (compPos >= 0)
- activeSelection.reset(new MouseSelection(*this, row, compPos, !refParent().isSelected(row, compPos)));
- }
+ activeSelection.reset(new MouseSelection(*this, row, !refParent().isSelected(row)));
else if (event.ShiftDown())
{
- if (compPos >= 0)
- activeSelection.reset(new MouseSelection(*this, selectionAnchor, compPos, true));
- refParent().clearSelectionAllAndNotify();
+ activeSelection.reset(new MouseSelection(*this, selectionAnchor, true));
+ refParent().clearSelection(ALLOW_GRID_EVENT);
}
else
{
- if (compPos >= 0)
- activeSelection.reset(new MouseSelection(*this, row, compPos, true));
- refParent().clearSelectionAllAndNotify();
+ activeSelection.reset(new MouseSelection(*this, row, true));
+ refParent().clearSelection(ALLOW_GRID_EVENT);
}
}
- //notify event *after* potential "clearSelectionAllAndNotify()" above: a client should first receive a GridRangeSelectEvent for clearing the grid, if necessary,
+ //notify event *after* potential "clearSelection(true)" above: a client should first receive a GridRangeSelectEvent for clearing the grid, if necessary,
//then GridClickEvent and the associated GridRangeSelectEvent one after the other
- GridClickEvent mouseEvent(event.RightDown() ? EVENT_GRID_MOUSE_RIGHT_DOWN : EVENT_GRID_MOUSE_LEFT_DOWN, event, row, colType, compPos);
+ GridClickEvent mouseEvent(event.RightDown() ? EVENT_GRID_MOUSE_RIGHT_DOWN : EVENT_GRID_MOUSE_LEFT_DOWN, event, row, colType);
sendEventNow(mouseEvent);
Refresh();
@@ -1052,22 +1031,21 @@ private:
{
if (activeSelection->getCurrentRow() < rowCount)
{
- cursor.first = activeSelection->getCurrentRow();
+ cursorRow = activeSelection->getCurrentRow();
selectionAnchor = activeSelection->getStartRow(); //allowed to be "out of range"
}
else if (activeSelection->getStartRow() < rowCount) //don't change cursor if "to" and "from" are out of range
{
- cursor.first = rowCount - 1;
+ cursorRow = rowCount - 1;
selectionAnchor = activeSelection->getStartRow(); //allowed to be "out of range"
}
else //total selection "out of range"
- selectionAnchor = cursor.first;
+ selectionAnchor = cursorRow;
}
//slight deviation from Explorer: change cursor while dragging mouse! -> unify behavior with shift + direction keys
refParent().selectRangeAndNotify(activeSelection->getStartRow (), //from
activeSelection->getCurrentRow(), //to
- activeSelection->getComponentPos(),
activeSelection->isPositiveSelect());
activeSelection.reset();
}
@@ -1075,14 +1053,12 @@ private:
//this one may point to row which is not in visible area!
const wxPoint absPos = refParent().CalcUnscrolledPosition(event.GetPosition());
- const auto row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
- const auto colInfo = refParent().getColumnAtPos(absPos.x); //returns optional pair (column type, compPos)
-
- const ColumnType colType = colInfo ? colInfo->first : DUMMY_COLUMN_TYPE; //we probably should notify even if colInfo is invalid!
- const ptrdiff_t compPos = colInfo ? colInfo->second : -1;
+ const ptrdiff_t row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
+ const Opt<ColumnType> ct = refParent().getColumnAtPos(absPos.x);
+ const ColumnType colType = ct ? *ct : DUMMY_COLUMN_TYPE; //we probably should notify even if colInfo is invalid!
//notify click event after the range selection! e.g. this makes sure the selection is applied before showing a context menu
- sendEventNow(GridClickEvent(event.RightUp() ? EVENT_GRID_MOUSE_RIGHT_UP : EVENT_GRID_MOUSE_LEFT_UP, event, row, colType, compPos));
+ sendEventNow(GridClickEvent(event.RightUp() ? EVENT_GRID_MOUSE_RIGHT_UP : EVENT_GRID_MOUSE_LEFT_UP, event, row, colType));
Refresh();
event.Skip(); //allow changing focus
@@ -1106,13 +1082,11 @@ private:
const ptrdiff_t rowCount = refParent().getRowCount();
const wxPoint absPos = refParent().CalcUnscrolledPosition(event.GetPosition());
- const auto row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
- const auto colInfo = refParent().getColumnAtPos(absPos.x); //returns (column type, compPos)
- if (colInfo && 0 <= row && row < rowCount)
- {
- if (auto prov = refParent().getDataProvider(colInfo->second))
- return prov->getToolTip(row, colInfo->first);
- }
+ const ptrdiff_t row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
+ const Opt<ColumnType> ct = refParent().getColumnAtPos(absPos.x);
+ if (ct && 0 <= row && row < rowCount)
+ if (auto prov = refParent().getDataProvider())
+ return prov->getToolTip(row, *ct);
return wxString();
}();
@@ -1137,17 +1111,16 @@ private:
}
const ptrdiff_t rowCount = refParent().getRowCount();
- if (rowCount <= 0 || refParent().comp.empty())
+ if (rowCount <= 0)
{
event.Skip();
return;
}
- auto setSingleSelection = [&](ptrdiff_t row, ptrdiff_t compPos)
+ auto setSingleSelection = [&](ptrdiff_t row)
{
- numeric::confine<ptrdiff_t>(row, 0, rowCount - 1);
- numeric::confine<ptrdiff_t>(compPos, 0, refParent().comp.size() - 1);
- refParent().setGridCursor(row, compPos); //behave like an "external" set cursor!
+ numeric::confine<ptrdiff_t>(row, 0, rowCount - 1);
+ refParent().setGridCursor(row); //behave like an "external" set cursor!
};
auto setSelectionRange = [&](ptrdiff_t row)
@@ -1156,11 +1129,10 @@ private:
numeric::confine<ptrdiff_t>(row, 0, rowCount - 1);
- for (Grid::Component& c : refParent().comp)
- c.selection.clear(); //clear selection, do NOT fire event
- refParent().selectRangeAndNotify(selectionAnchor, row, cursor.second); //set new selection + fire event
+ refParent().selection.clear(); //clear selection, do NOT fire event
+ refParent().selectRangeAndNotify(selectionAnchor, row); //set new selection + fire event
- cursor.first = row; //don't call setCursor() since it writes to "selectionAnchor"!
+ cursorRow = row; //don't call setCursor() since it writes to "selectionAnchor"!
this->makeRowVisible(row);
refParent().Refresh();
};
@@ -1170,21 +1142,21 @@ private:
case WXK_UP:
case WXK_NUMPAD_UP:
if (event.ShiftDown())
- setSelectionRange(cursor.first - 1);
+ setSelectionRange(cursorRow - 1);
else if (event.ControlDown())
refParent().scrollDelta(0, -1);
else
- setSingleSelection(cursor.first - 1, cursor.second);
+ setSingleSelection(cursorRow - 1);
return; //swallow event: wxScrolledWindow, wxWidgets 2.9.3 on Kubuntu x64 processes arrow keys: prevent this!
case WXK_DOWN:
case WXK_NUMPAD_DOWN:
if (event.ShiftDown())
- setSelectionRange(cursor.first + 1);
+ setSelectionRange(cursorRow + 1);
else if (event.ControlDown())
refParent().scrollDelta(0, 1);
else
- setSingleSelection(cursor.first + 1, cursor.second);
+ setSingleSelection(cursorRow + 1);
return; //swallow event
case WXK_LEFT:
@@ -1194,7 +1166,7 @@ private:
else if (event.ShiftDown())
;
else
- setSingleSelection(cursor.first, cursor.second - 1);
+ setSingleSelection(cursorRow);
return;
case WXK_RIGHT:
@@ -1204,7 +1176,7 @@ private:
else if (event.ShiftDown())
;
else
- setSingleSelection(cursor.first, cursor.second + 1);
+ setSingleSelection(cursorRow);
return;
case WXK_HOME:
@@ -1212,9 +1184,9 @@ private:
if (event.ShiftDown())
setSelectionRange(0);
else if (event.ControlDown())
- setSingleSelection(0, 0);
+ setSingleSelection(0);
else
- setSingleSelection(0, cursor.second);
+ setSingleSelection(0);
return;
case WXK_END:
@@ -1222,39 +1194,39 @@ private:
if (event.ShiftDown())
setSelectionRange(rowCount - 1);
else if (event.ControlDown())
- setSingleSelection(rowCount - 1, refParent().comp.size() - 1);
+ setSingleSelection(rowCount - 1);
else
- setSingleSelection(rowCount - 1, cursor.second);
+ setSingleSelection(rowCount - 1);
return;
case WXK_PAGEUP:
case WXK_NUMPAD_PAGEUP:
if (event.ShiftDown())
- setSelectionRange(cursor.first - GetClientSize().GetHeight() / rowLabelWin_.getRowHeight());
+ setSelectionRange(cursorRow - GetClientSize().GetHeight() / rowLabelWin_.getRowHeight());
else if (event.ControlDown())
;
else
- setSingleSelection(cursor.first - GetClientSize().GetHeight() / rowLabelWin_.getRowHeight(), cursor.second);
+ setSingleSelection(cursorRow - GetClientSize().GetHeight() / rowLabelWin_.getRowHeight());
return;
case WXK_PAGEDOWN:
case WXK_NUMPAD_PAGEDOWN:
if (event.ShiftDown())
- setSelectionRange(cursor.first + GetClientSize().GetHeight() / rowLabelWin_.getRowHeight());
+ setSelectionRange(cursorRow + GetClientSize().GetHeight() / rowLabelWin_.getRowHeight());
else if (event.ControlDown())
;
else
- setSingleSelection(cursor.first + GetClientSize().GetHeight() / rowLabelWin_.getRowHeight(), cursor.second);
+ setSingleSelection(cursorRow + GetClientSize().GetHeight() / rowLabelWin_.getRowHeight());
return;
case 'A': //Ctrl + A - select all
if (event.ControlDown())
- refParent().selectRangeAndNotify(0, rowCount, cursor.second);
+ refParent().selectRangeAndNotify(0, rowCount);
break;
case WXK_NUMPAD_ADD: //CTRL + '+' - auto-size all
if (event.ControlDown())
- refParent().autoSizeColumns(cursor.second);
+ refParent().autoSizeColumns(ALLOW_GRID_EVENT);
return;
}
@@ -1266,8 +1238,8 @@ private:
class MouseSelection : private wxEvtHandler
{
public:
- MouseSelection(MainWin& wnd, size_t rowStart, size_t compPos, bool positiveSelect) :
- wnd_(wnd), rowStart_(rowStart), compPos_(compPos), rowCurrent_(rowStart), positiveSelect_(positiveSelect), toScrollX(0), toScrollY(0),
+ MouseSelection(MainWin& wnd, size_t rowStart, bool positiveSelect) :
+ wnd_(wnd), rowStart_(rowStart), rowCurrent_(rowStart), positiveSelect_(positiveSelect), toScrollX(0), toScrollY(0),
tickCountLast(getTicks()),
ticksPerSec_(ticksPerSec())
{
@@ -1279,7 +1251,6 @@ private:
~MouseSelection() { if (wnd_.HasCapture()) wnd_.ReleaseMouse(); }
size_t getStartRow () const { return rowStart_; }
- size_t getComponentPos () const { return compPos_; }
size_t getCurrentRow () const { return rowCurrent_; }
bool isPositiveSelect() const { return positiveSelect_; } //are we selecting or unselecting?
@@ -1352,7 +1323,6 @@ private:
MainWin& wnd_;
const size_t rowStart_;
- const size_t compPos_;
ptrdiff_t rowCurrent_;
const bool positiveSelect_;
wxTimer timer;
@@ -1397,7 +1367,7 @@ private:
std::unique_ptr<MouseSelection> activeSelection; //bound while user is selecting with mouse
- std::pair<ptrdiff_t, ptrdiff_t> cursor; //(row, component position), always valid! still unsigned type to facilitate "onKeyDown()"
+ ptrdiff_t cursorRow;
size_t selectionAnchor;
bool gridUpdatePending;
};
@@ -1415,7 +1385,8 @@ Grid::Grid(wxWindow* parent,
showScrollbarY(SB_SHOW_AUTOMATIC),
colLabelHeight(0), //dummy init
drawRowLabel(true),
- comp(1),
+ allowColumnMove(true),
+ allowColumnResize(true),
rowCountOld(0)
{
cornerWin_ = new CornerWin (*this); //
@@ -1617,23 +1588,31 @@ void Grid::showRowLabel(bool show)
}
-std::vector<size_t> Grid::getSelectedRows(size_t compPos) const
+void Grid::selectAllRows(GridEventPolicy rangeEventPolicy)
{
- if (compPos < comp.size())
- return comp[compPos].selection.get();
- assert(false);
- return std::vector<size_t>();
+ selection.selectAll();
+ mainWin_->Refresh();
+
+ if (rangeEventPolicy == ALLOW_GRID_EVENT) //notify event, even if we're not triggered by user interaction
+ {
+ GridRangeSelectEvent selEvent(0, getRowCount(), true);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ evtHandler->ProcessEvent(selEvent);
+ }
}
-void Grid::setSelectedRows(const std::vector<size_t>& sel, size_t compPos)
+void Grid::clearSelection(GridEventPolicy rangeEventPolicy)
{
- if (compPos < comp.size())
+ selection.clear();
+ mainWin_->Refresh();
+
+ if (rangeEventPolicy == ALLOW_GRID_EVENT) //notify event, even if we're not triggered by user interaction
{
- comp[compPos].selection.set(sel);
- Refresh();
+ GridRangeSelectEvent unselectionEvent(0, getRowCount(), false);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ evtHandler->ProcessEvent(unselectionEvent);
}
- else assert(false);
}
@@ -1667,7 +1646,7 @@ void Grid::redirectRowLabelEvent(wxMouseEvent& event)
size_t Grid::getRowCount() const
{
- return comp.empty() ? 0 : comp.front().dataView_ ? comp.front().dataView_->getRowCount() : 0;
+ return dataView_ ? dataView_->getRowCount() : 0;
}
@@ -1680,9 +1659,8 @@ void Grid::Refresh(bool eraseBackground, const wxRect* rect)
updateWindowSizes();
}
- for (Component& c : comp)
- if (c.selection.size() != rowCountNew) //clear selection only when needed (consider setSelectedRows())
- c.selection.init(rowCountNew);
+ if (selection.size() != rowCountNew) //clear selection only when needed (consider setSelectedRows())
+ selection.init(rowCountNew);
wxScrolledWindow::Refresh(eraseBackground, rect);
}
@@ -1696,56 +1674,49 @@ void Grid::setRowHeight(int height)
}
-void Grid::setColumnConfig(const std::vector<Grid::ColumnAttribute>& attr, size_t compPos)
+void Grid::setColumnConfig(const std::vector<Grid::ColumnAttribute>& attr)
{
- if (compPos < comp.size())
- {
- //hold ownership of non-visible columns
- comp[compPos].oldColAttributes = attr;
+ //hold ownership of non-visible columns
+ oldColAttributes = attr;
- std::vector<VisibleColumn> visibleCols;
- for (const ColumnAttribute& ca : attr)
- if (ca.visible_)
- visibleCols.push_back(VisibleColumn(ca.type_, ca.offset_, ca.stretch_));
+ std::vector<VisibleColumn> visCols;
+ for (const ColumnAttribute& ca : attr)
+ if (ca.visible_)
+ visCols.push_back(VisibleColumn(ca.type_, ca.offset_, ca.stretch_));
- //"ownership" of visible columns is now within Grid
- comp[compPos].visibleCols = visibleCols;
+ //"ownership" of visible columns is now within Grid
+ visibleCols = visCols;
- updateWindowSizes();
- Refresh();
- }
+ updateWindowSizes();
+ Refresh();
}
-std::vector<Grid::ColumnAttribute> Grid::getColumnConfig(size_t compPos) const
+std::vector<Grid::ColumnAttribute> Grid::getColumnConfig() const
{
- if (compPos < comp.size())
- {
- //get non-visible columns (+ outdated visible ones)
- std::vector<ColumnAttribute> output = comp[compPos].oldColAttributes;
+ //get non-visible columns (+ outdated visible ones)
+ std::vector<ColumnAttribute> output = oldColAttributes;
- auto iterVcols = comp[compPos].visibleCols.begin();
- auto iterVcolsend = comp[compPos].visibleCols.end();
+ auto iterVcols = visibleCols.begin();
+ auto iterVcolsend = visibleCols.end();
- //update visible columns but keep order of non-visible ones!
- for (ColumnAttribute& ca : output)
- if (ca.visible_)
+ //update visible columns but keep order of non-visible ones!
+ for (ColumnAttribute& ca : output)
+ if (ca.visible_)
+ {
+ if (iterVcols != iterVcolsend)
{
- if (iterVcols != iterVcolsend)
- {
- ca.type_ = iterVcols->type_;
- ca.stretch_ = iterVcols->stretch_;
- ca.offset_ = iterVcols->offset_;
- ++iterVcols;
- }
- else
- assert(false);
+ ca.type_ = iterVcols->type_;
+ ca.stretch_ = iterVcols->stretch_;
+ ca.offset_ = iterVcols->offset_;
+ ++iterVcols;
}
- assert(iterVcols == iterVcolsend);
+ else
+ assert(false);
+ }
+ assert(iterVcols == iterVcolsend);
- return output;
- }
- return std::vector<ColumnAttribute>();
+ return output;
}
@@ -1841,34 +1812,6 @@ void Grid::SetScrollbar(int orientation, int position, int thumbSize, int range,
}
#endif
-//get rid of scrollbars, but preserve scrolling behavior!
-#ifdef ZEN_WIN
-WXLRESULT Grid::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
-{
- //we land here if wxWindowMSW::MSWWindowProc() couldn't handle the message
- //http://msdn.microsoft.com/en-us/library/windows/desktop/ms645614(v=vs.85).aspx
- if (nMsg == WM_MOUSEHWHEEL) //horizontal wheel
- {
- const int distance = GET_WHEEL_DELTA_WPARAM(wParam);
- const int delta = WHEEL_DELTA;
- int rotations = distance / delta;
-
- if (GetLayoutDirection() == wxLayout_RightToLeft)
- rotations = -rotations;
-
- static int linesPerRotation = -1;
- if (linesPerRotation < 0)
- if (!::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &linesPerRotation, 0))
- linesPerRotation = 3;
-
- scrollDelta(rotations * linesPerRotation, 0); //in scroll units
- return 0; //"If an application processes this message, it should return zero."
- }
-
- return wxScrolledWindow::MSWDefWindowProc(nMsg, wParam, lParam);
-}
-#endif
-
wxWindow& Grid::getCornerWin () { return *cornerWin_; }
wxWindow& Grid::getRowLabelWin() { return *rowLabelWin_; }
@@ -1877,27 +1820,20 @@ wxWindow& Grid::getMainWin () { return *mainWin_; }
const wxWindow& Grid::getMainWin() const { return *mainWin_; }
-wxRect Grid::getColumnLabelArea(ColumnType colType, size_t compPos) const
+wxRect Grid::getColumnLabelArea(ColumnType colType) const
{
- std::vector<std::vector<ColumnWidth>> compAbsWidths = getColWidths(); //resolve negative/stretched widths
- if (compPos < compAbsWidths.size())
- {
- auto iterComp = compAbsWidths.begin() + compPos;
-
- auto iterCol = std::find_if(iterComp->begin(), iterComp->end(), [&](const ColumnWidth& cw) { return cw.type_ == colType; });
- if (iterCol != iterComp->end())
- {
- ptrdiff_t posX = 0;
- for (auto it = compAbsWidths.begin(); it != iterComp; ++it)
- for (const ColumnWidth& cw : *it)
- posX += cw.width_;
+ std::vector<ColumnWidth> absWidths = getColWidths(); //resolve negative/stretched widths
- for (auto it = iterComp->begin(); it != iterCol; ++it)
- posX += it->width_;
+ auto iterCol = std::find_if(absWidths.begin(), absWidths.end(), [&](const ColumnWidth& cw) { return cw.type_ == colType; });
+ if (iterCol != absWidths.end())
+ {
+ ptrdiff_t posX = 0;
+ for (auto it = absWidths.begin(); it != iterCol; ++it)
+ posX += it->width_;
- return wxRect(wxPoint(posX, 0), wxSize(iterCol->width_, colLabelHeight));
- }
+ return wxRect(wxPoint(posX, 0), wxSize(iterCol->width_, colLabelHeight));
}
+
return wxRect();
}
@@ -1907,32 +1843,26 @@ Opt<Grid::ColAction> Grid::clientPosToColumnAction(const wxPoint& pos) const
const int absPosX = CalcUnscrolledPosition(pos).x;
if (absPosX >= 0)
{
- int accuWidth = 0;
+ const int resizeTolerance = allowColumnResize ? COLUMN_RESIZE_TOLERANCE : 0;
+ std::vector<ColumnWidth> absWidths = getColWidths(); //resolve stretched widths
- std::vector<std::vector<ColumnWidth>> compAbsWidths = getColWidths(); //resolve stretched widths
- for (size_t compPos = 0; compPos < compAbsWidths.size(); ++compPos)
+ int accuWidth = 0;
+ for (size_t col = 0; col < absWidths.size(); ++col)
{
- const int resizeTolerance = columnResizeAllowed(compPos) ? COLUMN_RESIZE_TOLERANCE : 0;
-
- for (size_t col = 0; col < compAbsWidths[compPos].size(); ++col)
+ accuWidth += absWidths[col].width_;
+ if (std::abs(absPosX - accuWidth) < resizeTolerance)
{
- accuWidth += compAbsWidths[compPos][col].width_;
- if (std::abs(absPosX - accuWidth) < resizeTolerance)
- {
- ColAction out = {};
- out.wantResize = true;
- out.col = col;
- out.compPos = compPos;
- return out;
- }
- else if (absPosX < accuWidth)
- {
- ColAction out = {};
- out.wantResize = false;
- out.col = col;
- out.compPos = compPos;
- return out;
- }
+ ColAction out = {};
+ out.wantResize = true;
+ out.col = col;
+ return out;
+ }
+ else if (absPosX < accuWidth)
+ {
+ ColAction out = {};
+ out.wantResize = false;
+ out.col = col;
+ return out;
}
}
}
@@ -1940,54 +1870,42 @@ Opt<Grid::ColAction> Grid::clientPosToColumnAction(const wxPoint& pos) const
}
-void Grid::moveColumn(size_t colFrom, size_t colTo, size_t compPos)
+void Grid::moveColumn(size_t colFrom, size_t colTo)
{
- if (compPos < comp.size())
+ if (colFrom < visibleCols.size() &&
+ colTo < visibleCols.size() &&
+ colTo != colFrom)
{
- auto& visibleCols = comp[compPos].visibleCols;
- if (colFrom < visibleCols.size() &&
- colTo < visibleCols.size() &&
- colTo != colFrom)
- {
- const auto colAtt = visibleCols[colFrom];
- visibleCols.erase (visibleCols.begin() + colFrom);
- visibleCols.insert(visibleCols.begin() + colTo, colAtt);
- }
+ const auto colAtt = visibleCols[colFrom];
+ visibleCols.erase (visibleCols.begin() + colFrom);
+ visibleCols.insert(visibleCols.begin() + colTo, colAtt);
}
}
-ptrdiff_t Grid::clientPosToMoveTargetColumn(const wxPoint& pos, size_t compPos) const
+ptrdiff_t Grid::clientPosToMoveTargetColumn(const wxPoint& pos) const
{
- std::vector<std::vector<ColumnWidth>> compAbsWidths = getColWidths(); //resolve negative/stretched widths
- if (compPos < compAbsWidths.size())
- {
- auto iterComp = compAbsWidths.begin() + compPos;
- const int absPosX = CalcUnscrolledPosition(pos).x;
+ std::vector<ColumnWidth> absWidths = getColWidths(); //resolve negative/stretched widths
- int accuWidth = 0;
- for (auto it = compAbsWidths.begin(); it != iterComp; ++it)
- for (const ColumnWidth& cw : *it)
- accuWidth += cw.width_;
+ const int absPosX = CalcUnscrolledPosition(pos).x;
- for (auto iterCol = iterComp->begin(); iterCol != iterComp->end(); ++iterCol)
- {
- const int width = iterCol->width_; //beware dreaded unsigned conversions!
- accuWidth += width;
+ int accuWidth = 0;
+ for (auto iterCol = absWidths.begin(); iterCol != absWidths.end(); ++iterCol)
+ {
+ const int width = iterCol->width_; //beware dreaded unsigned conversions!
+ accuWidth += width;
- if (absPosX < accuWidth - width / 2)
- return iterCol - iterComp->begin();
- }
- return iterComp->size();
+ if (absPosX < accuWidth - width / 2)
+ return iterCol - absWidths.begin();
}
- return -1;
+ return absWidths.size();
}
-Opt<ColumnType> Grid::colToType(size_t col, size_t compPos) const
+Opt<ColumnType> Grid::colToType(size_t col) const
{
- if (compPos < comp.size() && col < comp[compPos].visibleCols.size())
- return comp[compPos].visibleCols[col].type_;
+ if (col < visibleCols.size())
+ return visibleCols[col].type_;
return NoValue();
}
@@ -1995,96 +1913,61 @@ Opt<ColumnType> Grid::colToType(size_t col, size_t compPos) const
ptrdiff_t Grid::getRowAtPos(int posY) const { return rowLabelWin_->getRowAtPos(posY); }
-Opt<std::pair<ColumnType, size_t>> Grid::getColumnAtPos(int posX) const
+Opt<ColumnType> Grid::getColumnAtPos(int posX) const
{
if (posX >= 0)
{
- std::vector<std::vector<ColumnWidth>> compAbsWidths = getColWidths(); //resolve negative/stretched widths
-
int accWidth = 0;
- for (size_t compPos = 0; compPos < compAbsWidths.size(); ++compPos)
- for (const ColumnWidth& cw : compAbsWidths[compPos])
- {
- accWidth += cw.width_;
- if (posX < accWidth)
- return std::make_pair(cw.type_, compPos);
- }
+ for (const ColumnWidth& cw : getColWidths())
+ {
+ accWidth += cw.width_;
+ if (posX < accWidth)
+ return cw.type_;
+ }
}
return NoValue();
}
-wxRect Grid::getCellArea(size_t row, ColumnType colType, size_t compPos) const
+wxRect Grid::getCellArea(size_t row, ColumnType colType) const
{
- const wxRect& colArea = getColumnLabelArea(colType, compPos);
+ const wxRect& colArea = getColumnLabelArea(colType);
const wxRect& rowArea = rowLabelWin_->getRowLabelArea(row);
return wxRect(wxPoint(colArea.x, rowArea.y), wxSize(colArea.width, rowArea.height));
}
-void Grid::setGridCursor(size_t row, size_t compPos)
+void Grid::setGridCursor(size_t row)
{
- if (compPos < comp.size())
- {
- mainWin_->setCursor(row, compPos);
- mainWin_->makeRowVisible(row);
+ mainWin_->setCursor(row);
+ mainWin_->makeRowVisible(row);
- for (Grid::Component& c : comp)
- c.selection.clear(); //clear selection, do NOT fire event
- selectRangeAndNotify(row, row, compPos); //set new selection + fire event
+ selection.clear(); //clear selection, do NOT fire event
+ selectRangeAndNotify(row, row); //set new selection + fire event
- mainWin_->Refresh();
- rowLabelWin_->Refresh(); //row labels! (Kubuntu)
- }
+ mainWin_->Refresh();
+ rowLabelWin_->Refresh(); //row labels! (Kubuntu)
}
-void Grid::selectRangeAndNotify(ptrdiff_t rowFrom, ptrdiff_t rowTo, size_t compPos, bool positive)
+void Grid::selectRangeAndNotify(ptrdiff_t rowFrom, ptrdiff_t rowTo, bool positive)
{
- if (compPos < comp.size())
- {
- //sort + convert to half-open range
- auto rowFirst = std::min(rowFrom, rowTo);
- auto rowLast = std::max(rowFrom, rowTo) + 1;
-
- const size_t rowCount = getRowCount();
- numeric::confine<ptrdiff_t>(rowFirst, 0, rowCount);
- numeric::confine<ptrdiff_t>(rowLast, 0, rowCount);
-
- comp[compPos].selection.selectRange(rowFirst, rowLast, positive);
-
- //notify event
- GridRangeSelectEvent selectionEvent(rowFirst, rowLast, compPos, positive);
- if (wxEvtHandler* evtHandler = GetEventHandler())
- evtHandler->ProcessEvent(selectionEvent);
-
- mainWin_->Refresh();
- }
-}
+ //sort + convert to half-open range
+ auto rowFirst = std::min(rowFrom, rowTo);
+ auto rowLast = std::max(rowFrom, rowTo) + 1;
+ const size_t rowCount = getRowCount();
+ numeric::confine<ptrdiff_t>(rowFirst, 0, rowCount);
+ numeric::confine<ptrdiff_t>(rowLast, 0, rowCount);
-void Grid::clearSelection(bool emitSelectRangeEvent, size_t compPos)
-{
- if (compPos < comp.size())
- {
- comp[compPos].selection.clear();
- mainWin_->Refresh();
-
- if (emitSelectRangeEvent)
- {
- //notify event, even if we're not triggered by user interaction
- GridRangeSelectEvent unselectionEvent(0, 0, compPos, false);
- if (wxEvtHandler* evtHandler = GetEventHandler())
- evtHandler->ProcessEvent(unselectionEvent);
- }
- }
-}
+ selection.selectRange(rowFirst, rowLast, positive);
+ //notify event
+ GridRangeSelectEvent selectionEvent(rowFirst, rowLast, positive);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ evtHandler->ProcessEvent(selectionEvent);
-void Grid::clearSelectionAllAndNotify()
-{
- for (size_t compPos = 0; compPos < comp.size(); ++compPos)
- clearSelection(true, compPos);
+ mainWin_->Refresh();
}
@@ -2113,46 +1996,41 @@ void Grid::scrollTo(size_t row)
}
-std::pair<size_t, size_t> Grid::getGridCursor() const
+size_t Grid::getGridCursor() const
{
return mainWin_->getCursor();
}
-int Grid::getBestColumnSize(size_t col, size_t compPos) const
+int Grid::getBestColumnSize(size_t col) const
{
- if (compPos < comp.size())
+ if (dataView_ && col < visibleCols.size())
{
- const auto& visibleCols = comp[compPos].visibleCols;
- auto dataView = comp[compPos].dataView_;
- if (dataView && col < visibleCols.size())
- {
- const ColumnType type = visibleCols[col].type_;
+ const ColumnType type = visibleCols[col].type_;
- wxClientDC dc(mainWin_);
- dc.SetFont(mainWin_->GetFont()); //harmonize with MainWin::render()
+ wxClientDC dc(mainWin_);
+ dc.SetFont(mainWin_->GetFont()); //harmonize with MainWin::render()
- int maxSize = 0;
+ int maxSize = 0;
- auto rowRange = rowLabelWin_->getRowsOnClient(mainWin_->GetClientRect()); //returns range [begin, end)
- for (auto row = rowRange.first; row < rowRange.second; ++row)
- maxSize = std::max(maxSize, dataView->getBestSize(dc, row, type));
+ auto rowRange = rowLabelWin_->getRowsOnClient(mainWin_->GetClientRect()); //returns range [begin, end)
+ for (auto row = rowRange.first; row < rowRange.second; ++row)
+ maxSize = std::max(maxSize, dataView_->getBestSize(dc, row, type));
- return maxSize;
- }
+ return maxSize;
}
return -1;
}
-void Grid::setColWidthAndNotify(int width, size_t col, size_t compPos, bool notifyAsync)
+void Grid::setColumnWidth(int width, size_t col, GridEventPolicy columnResizeEventPolicy, bool notifyAsync)
{
- if (compPos < comp.size() && col < comp[compPos].visibleCols.size())
+ if (col < visibleCols.size())
{
- VisibleColumn& vcRs = comp[compPos].visibleCols[col];
+ VisibleColumn& vcRs = visibleCols[col];
- const std::vector<std::vector<int>> stretchedWidths = getColStretchedWidths(mainWin_->GetClientSize().GetWidth());
- if (stretchedWidths.size() != comp.size() || stretchedWidths[compPos].size() != comp[compPos].visibleCols.size())
+ const std::vector<int> stretchedWidths = getColStretchedWidths(mainWin_->GetClientSize().GetWidth());
+ if (stretchedWidths.size() != visibleCols.size())
{
assert(false);
return;
@@ -2163,7 +2041,7 @@ void Grid::setColWidthAndNotify(int width, size_t col, size_t compPos, bool noti
//unusual delay when enlarging the column again later
width = std::max(width, COLUMN_MIN_WIDTH);
- vcRs.offset_ = width - stretchedWidths[compPos][col]; //width := stretchedWidth + offset
+ vcRs.offset_ = width - stretchedWidths[col]; //width := stretchedWidth + offset
//III. resizing any column should normalize *all* other stretched columns' offsets considering current mainWinWidth!
// test case:
@@ -2171,21 +2049,20 @@ void Grid::setColWidthAndNotify(int width, size_t col, size_t compPos, bool noti
//2. shrink main window width so that horizontal scrollbars are shown despite the streched column
//3. shrink a fixed-size column so that the scrollbars vanish and columns cover full width again
//4. now verify that the stretched column is resizing immediately if main window is enlarged again
- for (size_t compPos2 = 0; compPos2 < comp.size(); ++compPos2)
- {
- auto& visibleCols = comp[compPos2].visibleCols;
- for (size_t col2 = 0; col2 < visibleCols.size(); ++col2)
- if (visibleCols[col2].stretch_ > 0) //normalize stretched columns only
- visibleCols[col2].offset_ = std::max(visibleCols[col2].offset_, COLUMN_MIN_WIDTH - stretchedWidths[compPos2][col2]);
- }
+ for (size_t col2 = 0; col2 < visibleCols.size(); ++col2)
+ if (visibleCols[col2].stretch_ > 0) //normalize stretched columns only
+ visibleCols[col2].offset_ = std::max(visibleCols[col2].offset_, COLUMN_MIN_WIDTH - stretchedWidths[col2]);
- GridColumnResizeEvent sizeEvent(vcRs.offset_, vcRs.type_, compPos);
- if (wxEvtHandler* evtHandler = GetEventHandler())
+ if (columnResizeEventPolicy == ALLOW_GRID_EVENT)
{
- if (notifyAsync)
- evtHandler->AddPendingEvent(sizeEvent);
- else
- evtHandler->ProcessEvent(sizeEvent);
+ GridColumnResizeEvent sizeEvent(vcRs.offset_, vcRs.type_);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ {
+ if (notifyAsync)
+ evtHandler->AddPendingEvent(sizeEvent);
+ else
+ evtHandler->ProcessEvent(sizeEvent);
+ }
}
}
else
@@ -2193,16 +2070,15 @@ void Grid::setColWidthAndNotify(int width, size_t col, size_t compPos, bool noti
}
-void Grid::autoSizeColumns(size_t compPos)
+void Grid::autoSizeColumns(GridEventPolicy columnResizeEventPolicy)
{
- if (compPos < comp.size() && comp[compPos].allowColumnResize)
+ if (allowColumnResize)
{
- auto& visibleCols = comp[compPos].visibleCols;
for (size_t col = 0; col < visibleCols.size(); ++col)
{
- const int bestWidth = getBestColumnSize(col, compPos); //return -1 on error
+ const int bestWidth = getBestColumnSize(col); //return -1 on error
if (bestWidth >= 0)
- setColWidthAndNotify(bestWidth, col, compPos, true);
+ setColumnWidth(bestWidth, col, columnResizeEventPolicy, true);
}
updateWindowSizes();
Refresh();
@@ -2210,91 +2086,71 @@ void Grid::autoSizeColumns(size_t compPos)
}
-std::vector<std::vector<int>> Grid::getColStretchedWidths(int clientWidth) const //final width = (normalized) (stretchedWidth + offset)
+std::vector<int> Grid::getColStretchedWidths(int clientWidth) const //final width = (normalized) (stretchedWidth + offset)
{
assert(clientWidth >= 0);
clientWidth = std::max(clientWidth, 0);
int stretchTotal = 0;
- for (const Component& c : comp)
- for (const VisibleColumn& vc : c.visibleCols)
- {
- assert(vc.stretch_ >= 0);
- stretchTotal += vc.stretch_;
- }
+ for (const VisibleColumn& vc : visibleCols)
+ {
+ assert(vc.stretch_ >= 0);
+ stretchTotal += vc.stretch_;
+ }
int remainingWidth = clientWidth;
- std::vector<std::vector<int>> output;
- for (const Component& c : comp)
- {
- output.push_back(std::vector<int>());
- auto& compWidths = output.back();
+ std::vector<int> output;
- if (stretchTotal <= 0)
- compWidths.resize(c.visibleCols.size()); //fill with zeros
- else
- for (const VisibleColumn& vc : c.visibleCols)
- {
- const int width = clientWidth * vc.stretch_ / stretchTotal; //rounds down!
- compWidths.push_back(width);
- remainingWidth -= width;
- }
- }
+ if (stretchTotal <= 0)
+ output.resize(visibleCols.size()); //fill with zeros
+ else
+ for (const VisibleColumn& vc : visibleCols)
+ {
+ const int width = clientWidth * vc.stretch_ / stretchTotal; //rounds down!
+ output.push_back(width);
+ remainingWidth -= width;
+ }
//distribute *all* of clientWidth: should suffice to enlarge the first few stretched columns; no need to minimize total absolute error of distribution
if (stretchTotal > 0)
if (remainingWidth > 0)
{
- for (size_t compPos2 = 0; compPos2 < comp.size(); ++compPos2)
- {
- auto& visibleCols = comp[compPos2].visibleCols;
- for (size_t col2 = 0; col2 < visibleCols.size(); ++col2)
- if (visibleCols[col2].stretch_ > 0)
- {
- ++output[compPos2][col2];
- if (--remainingWidth == 0)
- return output;
- }
- }
+ for (size_t col2 = 0; col2 < visibleCols.size(); ++col2)
+ if (visibleCols[col2].stretch_ > 0)
+ {
+ ++output[col2];
+ if (--remainingWidth == 0)
+ return output;
+ }
assert(false);
}
return output;
}
-std::vector<std::vector<Grid::ColumnWidth>> Grid::getColWidths() const
+std::vector<Grid::ColumnWidth> Grid::getColWidths() const
{
return getColWidths(mainWin_->GetClientSize().GetWidth());
}
-std::vector<std::vector<Grid::ColumnWidth>> Grid::getColWidths(int mainWinWidth) const //evaluate stretched columns; structure matches "comp"
+std::vector<Grid::ColumnWidth> Grid::getColWidths(int mainWinWidth) const //evaluate stretched columns
{
- const std::vector<std::vector<int>> stretchedWidths = getColStretchedWidths(mainWinWidth);
- assert(stretchedWidths.size() == comp.size());
+ const std::vector<int> stretchedWidths = getColStretchedWidths(mainWinWidth);
+ assert(stretchedWidths.size() == visibleCols.size());
- std::vector<std::vector<ColumnWidth>> output;
-
- for (size_t compPos2 = 0; compPos2 < comp.size(); ++compPos2)
+ std::vector<ColumnWidth> output;
+ for (size_t col2 = 0; col2 < visibleCols.size(); ++col2)
{
- assert(stretchedWidths[compPos2].size() == comp[compPos2].visibleCols.size());
-
- output.push_back(std::vector<ColumnWidth>());
- auto& compWidths = output.back();
-
- auto& visibleCols = comp[compPos2].visibleCols;
- for (size_t col2 = 0; col2 < visibleCols.size(); ++col2)
- {
- const auto& vc = visibleCols[col2];
- int width = stretchedWidths[compPos2][col2] + vc.offset_;
+ const auto& vc = visibleCols[col2];
+ int width = stretchedWidths[col2] + vc.offset_;
- if (vc.stretch_ > 0)
- width = std::max(width, COLUMN_MIN_WIDTH); //normalization really needed here: e.g. smaller main window would result in negative width
- else
- width = std::max(width, 0); //support smaller width than COLUMN_MIN_WIDTH if set via configuration
+ if (vc.stretch_ > 0)
+ width = std::max(width, COLUMN_MIN_WIDTH); //normalization really needed here: e.g. smaller main window would result in negative width
+ else
+ width = std::max(width, 0); //support smaller width than COLUMN_MIN_WIDTH if set via configuration
- compWidths.push_back(ColumnWidth(vc.type_, width));
- }
+ output.push_back(ColumnWidth(vc.type_, width));
}
return output;
}
@@ -2303,8 +2159,7 @@ std::vector<std::vector<Grid::ColumnWidth>> Grid::getColWidths(int mainWinWidth)
int Grid::getColWidthsSum(int mainWinWidth) const
{
int sum = 0;
- for (const std::vector<ColumnWidth>& cols : getColWidths(mainWinWidth))
- for (const ColumnWidth& cw : cols)
- sum += cw.width_;
+ for (const ColumnWidth& cw : getColWidths(mainWinWidth))
+ sum += cw.width_;
return sum;
};
diff --git a/wx+/grid.h b/wx+/grid.h
index e8f62a12..9bbb6c99 100644
--- a/wx+/grid.h
+++ b/wx+/grid.h
@@ -38,32 +38,30 @@ extern const wxEventType EVENT_GRID_SELECT_RANGE; //generates: GridRangeSelectEv
struct GridClickEvent : public wxMouseEvent
{
- GridClickEvent(wxEventType et, const wxMouseEvent& me, ptrdiff_t row, ColumnType colType, size_t compPos) : wxMouseEvent(me), row_(row), colType_(colType), compPos_(compPos) { SetEventType(et); }
+ GridClickEvent(wxEventType et, const wxMouseEvent& me, ptrdiff_t row, ColumnType colType) : wxMouseEvent(me), row_(row), colType_(colType) { SetEventType(et); }
virtual wxEvent* Clone() const { return new GridClickEvent(*this); }
+
const ptrdiff_t row_; //-1 for invalid position, >= rowCount if out of range
const ColumnType colType_;
- const size_t compPos_;
};
struct GridColumnResizeEvent : public wxCommandEvent
{
- GridColumnResizeEvent(int offset, ColumnType colType, size_t compPos) : wxCommandEvent(EVENT_GRID_COL_RESIZE), colType_(colType), offset_(offset), compPos_(compPos) {}
+ GridColumnResizeEvent(int offset, ColumnType colType) : wxCommandEvent(EVENT_GRID_COL_RESIZE), colType_(colType), offset_(offset) {}
virtual wxEvent* Clone() const { return new GridColumnResizeEvent(*this); }
const ColumnType colType_;
const int offset_;
- const size_t compPos_;
};
struct GridRangeSelectEvent : public wxCommandEvent
{
- GridRangeSelectEvent(size_t rowFirst, size_t rowLast, size_t compPos, bool positive) : wxCommandEvent(EVENT_GRID_SELECT_RANGE), rowFirst_(rowFirst), rowLast_(rowLast), compPos_(compPos), positive_(positive) { assert(rowFirst <= rowLast); }
+ GridRangeSelectEvent(size_t rowFirst, size_t rowLast, bool positive) : wxCommandEvent(EVENT_GRID_SELECT_RANGE), positive_(positive), rowFirst_(rowFirst), rowLast_(rowLast) { assert(rowFirst <= rowLast); }
virtual wxEvent* Clone() const { return new GridRangeSelectEvent(*this); }
+ const bool positive_; //"false" when clearing selection!
const size_t rowFirst_; //selected range: [rowFirst_, rowLast_)
- const size_t rowLast_; //range is empty when clearing selection
- const size_t compPos_;
- const bool positive_;
+ const size_t rowLast_;
};
typedef void (wxEvtHandler::*GridClickEventFunction )(GridClickEvent&);
@@ -90,7 +88,7 @@ class GridData
public:
virtual ~GridData() {}
- virtual size_t getRowCount() const = 0; //if there are multiple grid components, only the first one will be polled for row count!
+ virtual size_t getRowCount() const = 0;
//grid area
virtual wxString getValue(size_t row, ColumnType colType) const = 0;
@@ -116,6 +114,12 @@ protected: //optional helper routines
static void drawColumnLabelText (wxDC& dc, const wxRect& rect, const wxString& text);
};
+enum GridEventPolicy
+{
+ ALLOW_GRID_EVENT,
+ DENY_GRID_EVENT
+};
+
class Grid : public wxScrolledWindow
{
@@ -131,10 +135,6 @@ public:
void setRowHeight(int height);
- //grid component := a grid is divided into multiple components each of which is essentially a set of connected columns
- void setComponentCount(size_t count) { comp.resize(count); updateWindowSizes(); }
- size_t getComponentCount() const { return comp.size(); }
-
struct ColumnAttribute
{
ColumnAttribute(ColumnType type, int offset, int stretch, bool visible = true) : type_(type), visible_(visible), stretch_(std::max(stretch, 0)), offset_(offset) { assert(stretch >=0 ); }
@@ -146,12 +146,12 @@ public:
int offset_;
};
- void setColumnConfig(const std::vector<ColumnAttribute>& attr, size_t compPos = 0); //set column count + widths
- std::vector<ColumnAttribute> getColumnConfig(size_t compPos = 0) const;
+ void setColumnConfig(const std::vector<ColumnAttribute>& attr); //set column count + widths
+ std::vector<ColumnAttribute> getColumnConfig() const;
- void setDataProvider(const std::shared_ptr<GridData>& dataView, size_t compPos = 0) { if (compPos < comp.size()) comp[compPos].dataView_ = dataView; }
- /**/ GridData* getDataProvider(size_t compPos = 0) { return compPos < comp.size() ? comp[compPos].dataView_.get() : nullptr; }
- const GridData* getDataProvider(size_t compPos = 0) const { return compPos < comp.size() ? comp[compPos].dataView_.get() : nullptr; }
+ void setDataProvider(const std::shared_ptr<GridData>& dataView) { dataView_ = dataView; }
+ /**/ GridData* getDataProvider() { return dataView_.get(); }
+ const GridData* getDataProvider() const { return dataView_.get(); }
//-----------------------------------------------------------------------------
void setColumnLabelHeight(int height);
@@ -166,9 +166,9 @@ public:
//alternative until wxScrollHelper::ShowScrollbars() becomes available in wxWidgets 2.9
void showScrollBars(ScrollBarStatus horizontal, ScrollBarStatus vertical);
- std::vector<size_t> getSelectedRows(size_t compPos = 0) const;
- void setSelectedRows(const std::vector<size_t>& sel, size_t compPos = 0);
- void clearSelection(bool emitSelectRangeEvent = true, size_t compPos = 0); //turn off range selection event when calling this function in an event handler to avoid recursion!
+ std::vector<size_t> getSelectedRows() const { return selection.get(); }
+ void selectAllRows (GridEventPolicy rangeEventPolicy);
+ void clearSelection(GridEventPolicy rangeEventPolicy); //turn off range selection event when calling this function in an event handler to avoid recursion!
void scrollDelta(int deltaX, int deltaY); //in scroll units
@@ -179,21 +179,20 @@ public:
const wxWindow& getMainWin() const;
ptrdiff_t getRowAtPos(int posY) const; //return -1 for invalid position, >= rowCount if out of range; absolute coordinates!
- Opt<std::pair<ColumnType, size_t>> getColumnAtPos(int posX) const; //returns (column type, component pos)
+ Opt<ColumnType> getColumnAtPos(int posX) const;
- wxRect getCellArea(size_t row, ColumnType colType, size_t compPos = 0) const; //returns empty rect if column not found; absolute coordinates!
+ wxRect getCellArea(size_t row, ColumnType colType) const; //returns empty rect if column not found; absolute coordinates!
- void enableColumnMove (bool value, size_t compPos = 0) { if (compPos < comp.size()) comp[compPos].allowColumnMove = value; }
- void enableColumnResize(bool value, size_t compPos = 0) { if (compPos < comp.size()) comp[compPos].allowColumnResize = value; }
+ void enableColumnMove (bool value) { allowColumnMove = value; }
+ void enableColumnResize(bool value) { allowColumnResize = value; }
- void setGridCursor(size_t row, size_t compPos = 0); //set + show + select cursor (+ emit range selection event)
- std::pair<size_t, size_t> getGridCursor() const; //(row, component pos)
+ void setGridCursor(size_t row); //set + show + select cursor (+ emit range selection event)
+ size_t getGridCursor() const; //returns row
void scrollTo(size_t row);
virtual void Refresh(bool eraseBackground = true, const wxRect* rect = nullptr);
virtual bool Enable( bool enable = true) { Refresh(); return wxScrolledWindow::Enable(enable); }
- void autoSizeColumns(size_t compPos = 0);
//############################################################################################################
private:
@@ -211,11 +210,9 @@ private:
virtual void SetScrollbar(int orientation, int position, int thumbSize, int range, bool refresh); //get rid of scrollbars, but preserve scrolling behavior!
#endif
-#ifdef ZEN_WIN
- virtual WXLRESULT MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); //support horizontal mouse wheel
-#endif
+ int getBestColumnSize(size_t col) const; //return -1 on error
- int getBestColumnSize(size_t col, size_t compPos) const; //return -1 on error
+ void autoSizeColumns(GridEventPolicy columnResizeEventPolicy);
friend class GridData;
class SubWindow;
@@ -240,15 +237,8 @@ private:
return selection;
}
- void set(const std::vector<size_t>& newSel)
- {
- clear();
- for (size_t row : newSel)
- if (row < rowSelectionValue.size())
- rowSelectionValue[row] = true;
- }
-
- void clear() { selectRange(0, rowSelectionValue.size(), false); }
+ void selectAll() { selectRange(0, rowSelectionValue.size(), true); }
+ void clear () { selectRange(0, rowSelectionValue.size(), false); }
bool isSelected(size_t row) const { return row < rowSelectionValue.size() ? rowSelectionValue[row] != 0 : false; }
@@ -276,70 +266,52 @@ private:
int offset_;
};
- struct Component
- {
- Component() : allowColumnMove(true), allowColumnResize(true) {}
-
- std::shared_ptr<GridData> dataView_;
- Selection selection;
- bool allowColumnMove;
- bool allowColumnResize;
-
- std::vector<VisibleColumn> visibleCols; //individual widths, type and total column count
- std::vector<ColumnAttribute> oldColAttributes; //visible + nonvisible columns; use for conversion in setColumnConfig()/getColumnConfig() *only*!
- };
-
struct ColumnWidth
{
ColumnWidth(ColumnType type, int width) : type_(type), width_(width) {}
ColumnType type_;
int width_;
};
- std::vector<std::vector<ColumnWidth>> getColWidths() const; //
- std::vector<std::vector<ColumnWidth>> getColWidths(int mainWinWidth) const; //evaluate stretched columns; structure matches "comp"
+ std::vector<ColumnWidth> getColWidths() const; //
+ std::vector<ColumnWidth> getColWidths(int mainWinWidth) const; //evaluate stretched columns
int getColWidthsSum(int mainWinWidth) const;
- std::vector<std::vector<int>> getColStretchedWidths(int clientWidth) const; //final width = (normalized) (stretchedWidth + offset)
+ std::vector<int> getColStretchedWidths(int clientWidth) const; //final width = (normalized) (stretchedWidth + offset)
- Opt<int> getColWidth(size_t col, size_t compPos) const
+ Opt<int> getColWidth(size_t col) const
{
const auto& widths = getColWidths();
- if (compPos < widths.size() && col < widths[compPos].size())
- return widths[compPos][col].width_;
+ if (col < widths.size())
+ return widths[col].width_;
return NoValue();
}
- void setColWidthAndNotify(int width, size_t col, size_t compPos, bool notifyAsync = false);
+ void setColumnWidth(int width, size_t col, GridEventPolicy columnResizeEventPolicy, bool notifyAsync = false);
- wxRect getColumnLabelArea(ColumnType colType, size_t compPos) const; //returns empty rect if column not found
+ wxRect getColumnLabelArea(ColumnType colType) const; //returns empty rect if column not found
- void selectRangeAndNotify(ptrdiff_t rowFrom, ptrdiff_t rowTo, size_t compPos, bool positive = true); //select inclusive range [rowFrom, rowTo] + notify event!
+ void selectRangeAndNotify(ptrdiff_t rowFrom, ptrdiff_t rowTo, bool positive = true); //select inclusive range [rowFrom, rowTo] + notify event!
- void clearSelectionAllAndNotify(); //clear selection + notify event
-
- bool isSelected(size_t row, size_t compPos) const { return compPos < comp.size() ? comp[compPos].selection.isSelected(row) : false; }
-
- bool columnMoveAllowed (size_t compPos) const { return compPos < comp.size() ? comp[compPos].allowColumnMove : false; }
- bool columnResizeAllowed(size_t compPos) const { return compPos < comp.size() ? comp[compPos].allowColumnResize : false; }
+ bool isSelected(size_t row) const { return selection.isSelected(row); }
struct ColAction
{
bool wantResize; //"!wantResize" means "move" or "single click"
size_t col;
- size_t compPos;
};
Opt<ColAction> clientPosToColumnAction(const wxPoint& pos) const;
- void moveColumn(size_t colFrom, size_t colTo, size_t compPos);
- ptrdiff_t clientPosToMoveTargetColumn(const wxPoint& pos, size_t compPos) const; //return < 0 on error
+ void moveColumn(size_t colFrom, size_t colTo);
+ ptrdiff_t clientPosToMoveTargetColumn(const wxPoint& pos) const; //return < 0 on error
- Opt<ColumnType> colToType(size_t col, size_t compPos) const;
+ Opt<ColumnType> colToType(size_t col) const;
/*
Visual layout:
- ------------------------------------------------
- |CornerWin | ColLabelWin: |
- |-------------------------- Comp1 | Comp2 ... | row label and main window are vertically tiled into one or more "components"
- |RowLabelWin | MainWin: |
- ------------------------------------------------
+ --------------------------------
+ |CornerWin | ColLabelWin |
+ |------------------------------|
+ |RowLabelWin | MainWin |
+ | | |
+ --------------------------------
*/
CornerWin* cornerWin_;
RowLabelWin* rowLabelWin_;
@@ -352,7 +324,14 @@ private:
int colLabelHeight;
bool drawRowLabel;
- std::vector<Component> comp;
+ std::shared_ptr<GridData> dataView_;
+ Selection selection;
+ bool allowColumnMove;
+ bool allowColumnResize;
+
+ std::vector<VisibleColumn> visibleCols; //individual widths, type and total column count
+ std::vector<ColumnAttribute> oldColAttributes; //visible + nonvisible columns; use for conversion in setColumnConfig()/getColumnConfig() *only*!
+
size_t rowCountOld; //at the time of last Grid::Refresh()
};
}
diff --git a/wx+/popup_dlg.cpp b/wx+/popup_dlg.cpp
index 27526922..2c7887fa 100644
--- a/wx+/popup_dlg.cpp
+++ b/wx+/popup_dlg.cpp
@@ -14,7 +14,6 @@
using namespace zen;
-
namespace
{
void setAsStandard(wxButton& btn)
@@ -62,7 +61,12 @@ void setBestInitialSize(wxTextCtrl& ctrl, const wxString& text, wxSize maxSize)
it = itEnd + 1;
}
- const wxSize bestSize(bestWidth + scrollbarWidth, std::min(rowCount * rowHeight, maxSize.y));
+#if defined ZEN_WIN || defined ZEN_LINUX
+ const int rowGap = 0;
+#elif defined ZEN_MAC
+ const int rowGap = 1;
+#endif
+ const wxSize bestSize(bestWidth + scrollbarWidth, std::min(rowCount * (rowHeight + rowGap), maxSize.y));
ctrl.SetMinSize(bestSize); //alas, SetMinClientSize() is just not working!
}
}
diff --git a/wx+/popup_dlg_generated.cpp b/wx+/popup_dlg_generated.cpp
index b7618545..70c5cb20 100644
--- a/wx+/popup_dlg_generated.cpp
+++ b/wx+/popup_dlg_generated.cpp
@@ -11,79 +11,79 @@
PopupDialogGenerated::PopupDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer24;
- bSizer24 = new wxBoxSizer( wxVERTICAL );
-
- m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel33->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer165;
- bSizer165 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapMsgType = new wxStaticBitmap( m_panel33, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer165->Add( m_bitmapMsgType, 0, wxALL, 10 );
-
- wxBoxSizer* bSizer16;
- bSizer16 = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextMain = new wxStaticText( m_panel33, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextMain->Wrap( -1 );
- bSizer16->Add( m_staticTextMain, 0, wxTOP|wxBOTTOM|wxRIGHT, 15 );
-
- m_textCtrlTextDetail = new wxTextCtrl( m_panel33, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- bSizer16->Add( m_textCtrlTextDetail, 1, wxEXPAND, 5 );
-
-
- bSizer165->Add( bSizer16, 1, wxEXPAND, 5 );
-
-
- m_panel33->SetSizer( bSizer165 );
- m_panel33->Layout();
- bSizer165->Fit( m_panel33 );
- bSizer24->Add( m_panel33, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline6, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- wxBoxSizer* bSizer25;
- bSizer25 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxCustom = new wxCheckBox( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer25->Add( m_checkBoxCustom, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonAffirmative = new wxButton( this, wxID_YES, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonAffirmative, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonNegative = new wxButton( this, wxID_NO, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonNegative, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer25->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer24 );
- this->Layout();
- bSizer24->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( PopupDialogGenerated::OnClose ) );
- m_checkBoxCustom->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnCheckBoxClick ), NULL, this );
- m_buttonAffirmative->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnButtonAffirmative ), NULL, this );
- m_buttonNegative->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnButtonNegative ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer24;
+ bSizer24 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel33->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapMsgType = new wxStaticBitmap( m_panel33, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer165->Add( m_bitmapMsgType, 0, wxALL, 10 );
+
+ wxBoxSizer* bSizer16;
+ bSizer16 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextMain = new wxStaticText( m_panel33, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMain->Wrap( -1 );
+ bSizer16->Add( m_staticTextMain, 0, wxTOP|wxBOTTOM|wxRIGHT, 15 );
+
+ m_textCtrlTextDetail = new wxTextCtrl( m_panel33, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer16->Add( m_textCtrlTextDetail, 1, wxEXPAND, 5 );
+
+
+ bSizer165->Add( bSizer16, 1, wxEXPAND, 5 );
+
+
+ m_panel33->SetSizer( bSizer165 );
+ m_panel33->Layout();
+ bSizer165->Fit( m_panel33 );
+ bSizer24->Add( m_panel33, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline6, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ wxBoxSizer* bSizer25;
+ bSizer25 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxCustom = new wxCheckBox( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer25->Add( m_checkBoxCustom, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonAffirmative = new wxButton( this, wxID_YES, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonAffirmative, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonNegative = new wxButton( this, wxID_NO, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonNegative, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer25->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer24 );
+ this->Layout();
+ bSizer24->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( PopupDialogGenerated::OnClose ) );
+ m_checkBoxCustom->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnCheckBoxClick ), NULL, this );
+ m_buttonAffirmative->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnButtonAffirmative ), NULL, this );
+ m_buttonNegative->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnButtonNegative ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PopupDialogGenerated::OnCancel ), NULL, this );
}
PopupDialogGenerated::~PopupDialogGenerated()
diff --git a/wx+/popup_dlg_generated.h b/wx+/popup_dlg_generated.h
index 5aab9f68..3aab2257 100644
--- a/wx+/popup_dlg_generated.h
+++ b/wx+/popup_dlg_generated.h
@@ -37,35 +37,35 @@
///////////////////////////////////////////////////////////////////////////////
/// Class PopupDialogGenerated
///////////////////////////////////////////////////////////////////////////////
-class PopupDialogGenerated : public wxDialog
+class PopupDialogGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel33;
- wxStaticBitmap* m_bitmapMsgType;
- wxStaticText* m_staticTextMain;
- wxTextCtrl* m_textCtrlTextDetail;
- wxStaticLine* m_staticline6;
- wxCheckBox* m_checkBoxCustom;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonAffirmative;
- wxButton* m_buttonNegative;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnCheckBoxClick( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnButtonAffirmative( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnButtonNegative( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- PopupDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
- ~PopupDialogGenerated();
-
+private:
+
+protected:
+ wxPanel* m_panel33;
+ wxStaticBitmap* m_bitmapMsgType;
+ wxStaticText* m_staticTextMain;
+ wxTextCtrl* m_textCtrlTextDetail;
+ wxStaticLine* m_staticline6;
+ wxCheckBox* m_checkBoxCustom;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonAffirmative;
+ wxButton* m_buttonNegative;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnCheckBoxClick( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnButtonAffirmative( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnButtonNegative( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ PopupDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
+ ~PopupDialogGenerated();
+
};
#endif //__POPUP_DLG_GENERATED_H__
diff --git a/zen/FindFilePlus/FindFilePlus.vcxproj b/zen/FindFilePlus/FindFilePlus.vcxproj
index 56650735..eb5c672e 100644
--- a/zen/FindFilePlus/FindFilePlus.vcxproj
+++ b/zen/FindFilePlus/FindFilePlus.vcxproj
@@ -19,7 +19,7 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid>
+ <ProjectGuid>{814047ED-7701-494D-BBAF-AFEDF43EDC4E}</ProjectGuid>
<RootNamespace>ShadowDll</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
@@ -47,8 +47,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -61,188 +59,109 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
- <PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">FindFilePlus_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">FindFilePlus_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">FindFilePlus_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">FindFilePlus_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectName)_$(Platform)</TargetName>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Data\C++\WinDDK\inc\ddk;C:\Data\C++\WinDDK\inc\api;C:\Data\C++\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\Data\C++\WinDDK\inc\ddk;C:\Data\C++\WinDDK\inc\api;C:\Data\C++\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">C:\Data\C++\WinDDK\inc\ddk;C:\Data\C++\WinDDK\inc\api;C:\Data\C++\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">C:\Data\C++\WinDDK\inc\ddk;C:\Data\C++\WinDDK\inc\api;C:\Data\C++\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_X86_;_DEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_AMD64_;_DEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_X86_;NDEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_AMD64_;NDEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\debug_memory_leaks.cpp" />
- <ClCompile Include="dll_main.cpp">
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- </PrecompiledHeader>
- <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- </PrecompiledHeader>
- <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- </PrecompiledHeader>
- <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
- <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- </PrecompiledHeader>
- <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
- </ClCompile>
+ <ClCompile Include="dll_main.cpp" />
<ClCompile Include="find_file_plus.cpp" />
<ClCompile Include="load_dll.cpp" />
</ItemGroup>
@@ -251,6 +170,4 @@
<ClInclude Include="load_dll.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/zen/IFileOperation/FileOperation_Vista.vcxproj b/zen/IFileOperation/FileOperation.vcxproj
index 3ff45843..3f6923f3 100644
--- a/zen/IFileOperation/FileOperation_Vista.vcxproj
+++ b/zen/IFileOperation/FileOperation.vcxproj
@@ -19,8 +19,8 @@
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
- <ProjectName>Vista IFileOperation</ProjectName>
- <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid>
+ <ProjectName>FileOperation</ProjectName>
+ <ProjectGuid>{F6D3A51C-15EF-4710-BB67-3FCE9C0B5D92}</ProjectGuid>
<RootNamespace>ShadowDll</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
@@ -48,8 +48,6 @@
<PlatformToolset>v120_xp</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
@@ -62,41 +60,32 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
- <PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
- <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\FreeFileSync\Build\Bin\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\FreeFileSync\Obj\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">FileOperation_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">FileOperation_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">FileOperation_$(Platform)</TargetName>
- <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">FileOperation_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectName)_$(Platform)</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;_DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<ForcedIncludeFiles>zen/warn_static.h</ForcedIncludeFiles>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -104,132 +93,74 @@
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;_DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader>
- </PrecompiledHeader>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<SmallerTypeCheck>true</SmallerTypeCheck>
<ForcedIncludeFiles>zen/warn_static.h</ForcedIncludeFiles>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
- <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<ForcedIncludeFiles>zen/warn_static.h</ForcedIncludeFiles>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX86</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <BuildLog>
- <Path>$(IntDir)Build.html</Path>
- </BuildLog>
- <Midl>
- <TargetEnvironment>X64</TargetEnvironment>
- </Midl>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader>
- </PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
- <SuppressStartupBanner>true</SuppressStartupBanner>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4996;4512</DisableSpecificWarnings>
- <AdditionalIncludeDirectories>../..;C:\Data\C++\boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Data\Projects;C:\Data\C++\boost</AdditionalIncludeDirectories>
<ForcedIncludeFiles>zen/warn_static.h</ForcedIncludeFiles>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- <ProfileGuidedDatabase>
- </ProfileGuidedDatabase>
- <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
- <TargetMachine>MachineX64</TargetMachine>
<AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -245,6 +176,4 @@
<ClInclude Include="file_op.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
</Project> \ No newline at end of file
diff --git a/zen/debug_minidump.h b/zen/debug_minidump.h
index e2605038..2ef43039 100644
--- a/zen/debug_minidump.h
+++ b/zen/debug_minidump.h
@@ -21,11 +21,11 @@ Minidumps http://msdn.microsoft.com/en-us/library/windows/desktop/ee416349(v=vs.
----------------------------------------------------------------------------------------
1. Compile "debug_minidump.cpp"
2. Compile "release" build with:
+ - C/C++ -> General: Debug Information Format: "Program Database" (/Zi).
+ - C/C++ -> Optimization: Omit Frame Pointers: No (/Oy-) - avoid call stack mess up!
- Linker -> Debugging: Generate Debug Info: Yes (/DEBUG)
- Linker -> Optimization: References: Yes (/OPT:REF).
- Linker -> Optimization: Enable COMDAT Folding: Yes (/OPT:ICF).
- - C/C++ -> General: Debug Information Format: "Program Database" (/Zi).
- - C/C++ -> Optimization: Omit Frame Pointers: No (/Oy-) - avoid call stack mess up!
Optional:
- C/C++ -> Optimization: Disabled (/Od)
*/
diff --git a/zen/dir_watcher.cpp b/zen/dir_watcher.cpp
index 17efda00..1945ada7 100644
--- a/zen/dir_watcher.cpp
+++ b/zen/dir_watcher.cpp
@@ -22,7 +22,7 @@
#elif defined ZEN_MAC
//#include <sys/types.h>
-#include <sys/event.h>
+//#include <sys/event.h>
//#include <sys/time.h>
#include "file_traverser.h"
#endif
@@ -519,6 +519,13 @@ std::vector<DirWatcher::Entry> DirWatcher::getChanges(const std::function<void()
}
#elif defined ZEN_MAC
+warn_static("finish");
+struct DirWatcher::Pimpl {};
+DirWatcher::DirWatcher(const Zstring& directory) {}
+DirWatcher::~DirWatcher() {}
+std::vector<DirWatcher::Entry> DirWatcher::getChanges(const std::function<void()>&) { return std::vector<DirWatcher::Entry>(); }
+
+#if 0
namespace
{
class DirsOnlyTraverser : public zen::TraverseCallback
@@ -694,3 +701,6 @@ std::vector<DirWatcher::Entry> DirWatcher::getChanges(const std::function<void()
return output;
}
#endif
+
+
+#endif
diff --git a/zen/file_handling.cpp b/zen/file_handling.cpp
index fd4239ed..621c2b1b 100644
--- a/zen/file_handling.cpp
+++ b/zen/file_handling.cpp
@@ -143,9 +143,10 @@ Zstring getLockingProcessNames(const Zstring& filename) //throw(), empty string
return Zstring();
}
#endif
+}
-void getFileAttrib(const Zstring& filename, FileAttrib& attr, ProcSymlink procSl) //throw FileError
+UInt64 zen::getFilesize(const Zstring& filename) //throw FileError
{
#ifdef ZEN_WIN
WIN32_FIND_DATA fileInfo = {};
@@ -160,24 +161,8 @@ void getFileAttrib(const Zstring& filename, FileAttrib& attr, ProcSymlink procSl
// GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
// &sourceAttr)) //__out LPVOID lpFileInformation
- if (!isSymlink(fileInfo) || procSl == SYMLINK_DIRECT)
- {
- //####################################### DST hack ###########################################
- const bool isDirectory = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
- if (!isDirectory && dst::isFatDrive(filename)) //throw()
- {
- const dst::RawTime rawTime(fileInfo.ftCreationTime, fileInfo.ftLastWriteTime);
- if (dst::fatHasUtcEncoded(rawTime)) //throw std::runtime_error
- {
- fileInfo.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return last write time in real UTC, throw (std::runtime_error)
- ::GetSystemTimeAsFileTime(&fileInfo.ftCreationTime); //real creation time information is not available...
- }
- }
- //####################################### DST hack ###########################################
-
- attr.fileSize = UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
- attr.modificationTime = toTimeT(fileInfo.ftLastWriteTime);
- }
+ if (!isSymlink(fileInfo))
+ return UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
else
{
const HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(), //open handle to target of symbolic link
@@ -195,42 +180,19 @@ void getFileAttrib(const Zstring& filename, FileAttrib& attr, ProcSymlink procSl
if (!::GetFileInformationByHandle(hFile, &fileInfoHnd))
throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"GetFileInformationByHandle", getLastError()));
- attr.fileSize = UInt64(fileInfoHnd.nFileSizeLow, fileInfoHnd.nFileSizeHigh);
- attr.modificationTime = toTimeT(fileInfoHnd.ftLastWriteTime);
+ return UInt64(fileInfoHnd.nFileSizeLow, fileInfoHnd.nFileSizeHigh);
}
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat fileInfo = {};
-
- const int rv = procSl == SYMLINK_FOLLOW ?
- :: stat(filename.c_str(), &fileInfo) :
- ::lstat(filename.c_str(), &fileInfo);
- if (rv != 0)
+ if (::stat(filename.c_str(), &fileInfo) != 0)
throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"stat", getLastError()));
- attr.fileSize = UInt64(fileInfo.st_size);
- attr.modificationTime = fileInfo.st_mtime;
+ return UInt64(fileInfo.st_size);
#endif
}
-Int64 getFileTime(const Zstring& filename, ProcSymlink procSl) //throw FileError
-{
- FileAttrib attr;
- getFileAttrib(filename, attr, procSl); //throw FileError
- return attr.modificationTime;
-}
-}
-
-
-UInt64 zen::getFilesize(const Zstring& filename) //throw FileError
-{
- FileAttrib attr;
- getFileAttrib(filename, attr, SYMLINK_FOLLOW); //throw FileError
- return attr.fileSize;
-}
-
-
UInt64 zen::getFreeDiskSpace(const Zstring& path) //throw FileError
{
#ifdef ZEN_WIN
@@ -614,34 +576,11 @@ void removeDirectoryImpl(const Zstring& directory, CallbackRemoveDir* callback)
//Sample code: http://us.generation-nt.com/answer/createfile-directory-handles-removing-parent-help-29126332.html
}
}
-}
-
-
-void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback)
-{
- //no error situation if directory is not existing! manual deletion relies on it!
- if (!somethingExists(directory))
- return; //neither directory nor any other object (e.g. broken symlink) with that name existing
- removeDirectoryImpl(directory, callback);
-}
-
-void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink procSl) //throw FileError
-{
#ifdef ZEN_WIN
- FILETIME creationTime = {};
- FILETIME lastWriteTime = tofiletime(modTime);
-
- //####################################### DST hack ###########################################
- if (dst::isFatDrive(filename)) //throw()
- {
- const dst::RawTime encodedTime = dst::fatEncodeUtcTime(lastWriteTime); //throw std::runtime_error
- creationTime = encodedTime.createTimeRaw;
- lastWriteTime = encodedTime.writeTimeRaw;
- }
- //####################################### DST hack ###########################################
-
+void setFileTimeRaw(const Zstring& filename, const FILETIME& creationTime, const FILETIME& lastWriteTime, ProcSymlink procSl) //throw FileError
+{
{
//extra scope for debug check below
@@ -856,31 +795,59 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink
throw FileError(errorMsg, errorDescr);
}
}
-#ifndef NDEBUG //dst hack: verify data written
- if (dst::isFatDrive(filename) && fileExists(filename)) //throw()
- {
- FILETIME creationTimeDbg = {};
- FILETIME lastWriteTimeDbg = {};
-
- HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(),
- FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- nullptr,
- OPEN_EXISTING,
- 0,
- nullptr);
- assert(hFile != INVALID_HANDLE_VALUE);
- ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile));
+#ifndef NDEBUG //verify written data: mainly required to check consistency of DST hack
+ FILETIME creationTimeDbg = {};
+ FILETIME lastWriteTimeDbg = {};
- assert(::GetFileTime(hFile, //probably more up to date than GetFileAttributesEx()!?
- &creationTimeDbg,
- nullptr,
- &lastWriteTimeDbg));
+ HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(),
+ FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ nullptr,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | //needed to open a directory
+ (procSl == SYMLINK_DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0),
+ nullptr);
+ assert(hFile != INVALID_HANDLE_VALUE);
+ ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile));
- assert(::CompareFileTime(&creationTimeDbg, &creationTime) == 0);
- assert(::CompareFileTime(&lastWriteTimeDbg, &lastWriteTime) == 0);
- }
+ assert(::GetFileTime(hFile, //probably more up to date than GetFileAttributesEx()!?
+ &creationTimeDbg,
+ nullptr,
+ &lastWriteTimeDbg));
+
+ assert(::CompareFileTime(&creationTimeDbg, &creationTime) == 0);
+ assert(::CompareFileTime(&lastWriteTimeDbg, &lastWriteTime) == 0);
#endif
+}
+#endif
+}
+
+
+void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback)
+{
+ //no error situation if directory is not existing! manual deletion relies on it!
+ if (!somethingExists(directory))
+ return; //neither directory nor any other object (e.g. broken symlink) with that name existing
+ removeDirectoryImpl(directory, callback);
+}
+
+
+void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink procSl) //throw FileError
+{
+#ifdef ZEN_WIN
+ FILETIME creationTime = {};
+ FILETIME lastWriteTime = toFileTime(modTime);
+
+ //####################################### DST hack ###########################################
+ if (dst::isFatDrive(filename)) //throw(); hacky: does not consider symlinks pointing to FAT!
+ {
+ const dst::RawTime encodedTime = dst::fatEncodeUtcTime(lastWriteTime); //throw std::runtime_error
+ creationTime = encodedTime.createTimeRaw;
+ lastWriteTime = encodedTime.writeTimeRaw;
+ }
+ //####################################### DST hack ###########################################
+
+ setFileTimeRaw(filename, creationTime, lastWriteTime, procSl); //throw FileError
#elif defined ZEN_LINUX || defined ZEN_MAC
//sigh, we can't use utimensat on NTFS volumes on Ubuntu: silent failure!!! what morons are programming this shit???
@@ -1423,10 +1390,22 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool
});
//file times: essential for sync'ing a symlink: enforce this! (don't just try!)
- {
- const Int64 modTime = getFileTime(sourceLink, SYMLINK_DIRECT); //throw FileError
- setFileTime(targetLink, modTime, SYMLINK_DIRECT); //throw FileError
- }
+#ifdef ZEN_WIN
+ WIN32_FILE_ATTRIBUTE_DATA sourceAttr = {};
+ if (!::GetFileAttributesEx(applyLongPathPrefix(sourceLink).c_str(), //__in LPCTSTR lpFileName,
+ GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
+ &sourceAttr)) //__out LPVOID lpFileInformation
+ throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceLink)), formatSystemError(L"GetFileAttributesEx", getLastError()));
+
+ setFileTimeRaw(targetLink, sourceAttr.ftCreationTime, sourceAttr.ftLastWriteTime, SYMLINK_DIRECT); //throw FileError
+
+#elif defined ZEN_LINUX || defined ZEN_MAC
+ struct ::stat srcInfo = {};
+ if (::lstat(sourceLink.c_str(), &srcInfo) != 0)
+ throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceLink)), formatSystemError(L"lstat", getLastError()));
+
+ setFileTime(targetLink, Int64(srcInfo.st_mtime), SYMLINK_DIRECT); //throw FileError
+#endif
if (copyFilePermissions)
copyObjectPermissions(sourceLink, targetLink, SYMLINK_DIRECT); //throw FileError
@@ -1538,7 +1517,7 @@ bool canCopyAsSparse(const Zstring& sourceFile, const Zstring& targetFile) //thr
void copyFileWindowsSparse(const Zstring& sourceFile,
const Zstring& targetFile,
CallbackCopyFile* callback,
- FileAttrib* newAttrib) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked
+ InSyncAttributes* newAttrib) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked
{
assert(canCopyAsSparse(sourceFile, targetFile));
@@ -1894,6 +1873,7 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
//#################### copy file creation time ################################
::SetFileTime(hDestinationFile, &cbd.fileInfoSrc.ftCreationTime, nullptr, nullptr); //no error handling!
+ //=> not really needed here, creation time is set anyway at the end of copyFileWindowsDefault()!
//#################### copy NTFS compressed attribute #########################
const bool sourceIsCompressed = (cbd.fileInfoSrc.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0;
@@ -1945,7 +1925,7 @@ const bool supportNonEncryptedDestination = winXpOrLater(); //encrypted destinat
void copyFileWindowsDefault(const Zstring& sourceFile,
const Zstring& targetFile,
CallbackCopyFile* callback,
- FileAttrib* newAttrib) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked, ErrorShouldCopyAsSparse
+ InSyncAttributes* newAttrib) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked, ErrorShouldCopyAsSparse
{
//try to get backup read and write privileges: who knows, maybe this helps solve some obscure "access denied" errors
try { activatePrivilege(SE_BACKUP_NAME); }
@@ -2034,21 +2014,44 @@ void copyFileWindowsDefault(const Zstring& sourceFile,
if (newAttrib)
{
newAttrib->fileSize = UInt64(cbd.fileInfoSrc.nFileSizeLow, cbd.fileInfoSrc.nFileSizeHigh);
- newAttrib->modificationTime = toTimeT(cbd.fileInfoSrc.ftLastWriteTime); //no DST hack (yet)
+ //newAttrib->modificationTime = -> set further below
newAttrib->sourceFileId = extractFileID(cbd.fileInfoSrc);
newAttrib->targetFileId = extractFileID(cbd.fileInfoTrg);
}
{
- //DST hack
- const Int64 modTime = getFileTime(sourceFile, SYMLINK_FOLLOW); //throw FileError
- setFileTime(targetFile, modTime, SYMLINK_FOLLOW); //throw FileError
- //caveat: - ::CopyFileEx() silently *ignores* failure to set modification time!!! => we need to set it again but with proper error checking!
- // - this sequence leads to a loss of precision of up to 1 sec!
- // - perf-loss on USB sticks with many small files of about 30%! damn!
+ FILETIME creationtime = cbd.fileInfoSrc.ftCreationTime;
+ FILETIME lastWriteTimeRaw = cbd.fileInfoSrc.ftLastWriteTime;
+ //####################################### DST hack ###########################################
+ if (dst::isFatDrive(sourceFile)) //throw(); hacky: does not consider symlinks pointing to FAT!
+ {
+ const dst::RawTime rawTime(creationtime, lastWriteTimeRaw);
+ if (dst::fatHasUtcEncoded(rawTime)) //throw std::runtime_error
+ {
+ lastWriteTimeRaw = dst::fatDecodeUtcTime(rawTime); //return last write time in real UTC, throw (std::runtime_error)
+ ::GetSystemTimeAsFileTime(&creationtime); //real creation time information is not available...
+ }
+ }
+ //####################################### DST hack ###########################################
if (newAttrib)
- newAttrib->modificationTime = modTime;
+ newAttrib->modificationTime = toTimeT(lastWriteTimeRaw);
+
+ //caveat: - ::CopyFileEx() silently *ignores* failure to set modification time!!! => we always need to set it again but with proper error checking!
+ // - perf-loss on USB sticks with many small files of about 30%!
+ FILETIME creationTimeOut = creationtime;
+ FILETIME lastWriteTimeOut = lastWriteTimeRaw;
+
+ //####################################### DST hack ###########################################
+ if (dst::isFatDrive(targetFile)) //throw(); target cannot be a symlink in this context!
+ {
+ const dst::RawTime encodedTime = dst::fatEncodeUtcTime(lastWriteTimeRaw); //throw std::runtime_error
+ creationTimeOut = encodedTime.createTimeRaw;
+ lastWriteTimeOut = encodedTime.writeTimeRaw;
+ }
+ //####################################### DST hack ###########################################
+
+ setFileTimeRaw(targetFile, creationTimeOut, lastWriteTimeOut, SYMLINK_FOLLOW); //throw FileError
}
guardTarget.dismiss(); //target has been created successfully!
@@ -2057,7 +2060,7 @@ void copyFileWindowsDefault(const Zstring& sourceFile,
//another layer to support copying sparse files
inline
-void copyFileWindowsSelectRoutine(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, FileAttrib* sourceAttr)
+void copyFileWindowsSelectRoutine(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, InSyncAttributes* sourceAttr)
{
try
{
@@ -2072,7 +2075,7 @@ void copyFileWindowsSelectRoutine(const Zstring& sourceFile, const Zstring& targ
//another layer of indirection solving 8.3 name clashes
inline
-void copyFileWindows(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, FileAttrib* sourceAttr)
+void copyFileWindows(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, InSyncAttributes* sourceAttr)
{
try
{
@@ -2096,7 +2099,7 @@ void copyFileWindows(const Zstring& sourceFile, const Zstring& targetFile, Callb
void copyFileLinuxMac(const Zstring& sourceFile,
const Zstring& targetFile,
CallbackCopyFile* callback,
- FileAttrib* newAttrib) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting
+ InSyncAttributes* newAttrib) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting
{
//open sourceFile for reading
FileInputUnbuffered fileIn(sourceFile); //throw FileError
@@ -2187,7 +2190,7 @@ copyFileWindowsDefault(::CopyFileEx) copyFileWindowsSparse(::BackupRead/::Backu
*/
inline
-void copyFileSelectOs(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, FileAttrib* sourceAttr)
+void copyFileSelectOs(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, InSyncAttributes* sourceAttr)
{
#ifdef ZEN_WIN
copyFileWindows(sourceFile, targetFile, callback, sourceAttr); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked
@@ -2204,7 +2207,7 @@ void zen::copyFile(const Zstring& sourceFile, //throw FileError, ErrorTargetPath
bool copyFilePermissions,
bool transactionalCopy,
CallbackCopyFile* callback,
- FileAttrib* sourceAttr)
+ InSyncAttributes* sourceAttr)
{
if (transactionalCopy)
{
diff --git a/zen/file_handling.h b/zen/file_handling.h
index 2c4f7938..b3d5ca1a 100644
--- a/zen/file_handling.h
+++ b/zen/file_handling.h
@@ -52,7 +52,7 @@ void makeDirectory(const Zstring& directory, bool failIfExists = false); //throw
//templateDir may be empty
void makeDirectoryPlain(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
-struct FileAttrib
+struct InSyncAttributes
{
UInt64 fileSize;
Int64 modificationTime; //time_t UTC compatible
@@ -65,7 +65,7 @@ void copyFile(const Zstring& sourceFile, //throw FileError, ErrorTargetPathMissi
bool copyFilePermissions,
bool transactionalCopy,
CallbackCopyFile* callback, //may be nullptr
- FileAttrib* newAttrib = nullptr); //return current attributes at the time of copy
+ InSyncAttributes* newAttrib = nullptr); //return current attributes at the time of copy
//Note: it MAY happen that copyFile() leaves temp files behind, e.g. temporary network drop.
// => clean them up at an appropriate time (automatically set sync directions to delete them). They have the following ending:
const Zstring TEMP_FILE_ENDING = Zstr(".ffs_tmp");
diff --git a/zen/file_id.cpp b/zen/file_id.cpp
deleted file mode 100644
index 310390da..00000000
--- a/zen/file_id.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
-// **************************************************************************
-
-#include "file_id.h"
-
-#ifdef ZEN_WIN
-#include "win.h" //includes "windows.h"
-#include "long_path_prefix.h"
-#include "scope_guard.h"
-
-#elif defined ZEN_LINUX || defined ZEN_MAC
-#include <sys/stat.h>
-#endif
-
-
-zen::FileId zen::getFileID(const Zstring& filename)
-{
-#ifdef ZEN_WIN
- //WARNING: CreateFile() is SLOW, while GetFileInformationByHandle() is cheap! http://msdn.microsoft.com/en-us/library/aa363788(VS.85).aspx
- //privilege SE_BACKUP_NAME doesn't seem to be required here at all
-
- const HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
- 0,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- nullptr,
- OPEN_EXISTING,
- FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, //FILE_FLAG_BACKUP_SEMANTICS needed to open a directory
- nullptr);
- if (hFile != INVALID_HANDLE_VALUE)
- {
- ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile));
-
- BY_HANDLE_FILE_INFORMATION fileInfo = {};
- if (::GetFileInformationByHandle(hFile, &fileInfo))
- return extractFileID(fileInfo);
- }
-
-#elif defined ZEN_LINUX || defined ZEN_MAC
- struct ::stat fileInfo = {};
- if (::lstat(filename.c_str(), &fileInfo) == 0)
- return extractFileID(fileInfo);
-#endif
-
- return zen::FileId();
-}
-
-//test whether two distinct paths point to the same file or directory:
-// true: paths point to same files/dirs
-// false: error occurred OR point to different files/dirs
-//bool zen::samePhysicalFile(const Zstring& file1, const Zstring& file2)
-//{
-// if (EqualFilename()(file1, file2)) //quick check
-// return true;
-//
-// const auto id1 = getFileID(file1);
-// const auto id2 = getFileID(file2);
-//
-// if (id1 == zen::FileId() || id2 == zen::FileId())
-// return false;
-//
-// return id1 == id2;
-//}
diff --git a/zen/file_id.h b/zen/file_id.h
deleted file mode 100644
index 0ff6d7ec..00000000
--- a/zen/file_id.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
-// **************************************************************************
-
-#ifndef FILEID_H_INCLUDED_32q87634289562345
-#define FILEID_H_INCLUDED_32q87634289562345
-
-#include "file_id_def.h"
-#include "zstring.h"
-
-//unique file identifier
-
-namespace zen
-{
-//get unique file id (symbolic link handling: opens the link!!!)
-//returns initial FileId() on error!
-FileId getFileID(const Zstring& filename);
-}
-
-#endif //FILEID_H_INCLUDED_32q87634289562345
diff --git a/zen/file_traverser.cpp b/zen/file_traverser.cpp
index 959a6071..0e06d6c5 100644
--- a/zen/file_traverser.cpp
+++ b/zen/file_traverser.cpp
@@ -464,7 +464,7 @@ private:
//even at this point it's not sure whether data was written correctly, again cloud storages tend to lie about success status
if (filesToValidate-- > 0)
{
- const dst::RawTime encodedTime = dst::fatEncodeUtcTime(tofiletime(it->second)); //throw std::runtime_error
+ const dst::RawTime encodedTime = dst::fatEncodeUtcTime(toFileTime(it->second)); //throw std::runtime_error
//dst hack: verify data written; attention: this check may fail for "sync.ffs_lock"
WIN32_FILE_ATTRIBUTE_DATA debugeAttr = {};
diff --git a/zen/fixed_list.h b/zen/fixed_list.h
index d38dbae5..7e35f012 100644
--- a/zen/fixed_list.h
+++ b/zen/fixed_list.h
@@ -34,7 +34,7 @@ class FixedList
public:
FixedList() :
- first(nullptr),
+ firstInsert(nullptr),
lastInsert(nullptr),
sz(0) {}
@@ -60,17 +60,17 @@ public:
typedef T& reference;
typedef const T& const_reference;
- iterator begin() { return first; }
+ iterator begin() { return firstInsert; }
iterator end() { return iterator(); }
- const_iterator begin() const { return first; }
+ const_iterator begin() const { return firstInsert; }
const_iterator end () const { return const_iterator(); }
- const_iterator cbegin() const { return first; }
+ const_iterator cbegin() const { return firstInsert; }
const_iterator cend () const { return const_iterator(); }
- reference front() { return first->val; }
- const_reference front() const { return first->val; }
+ reference front() { return firstInsert->val; }
+ const_reference front() const { return firstInsert->val; }
reference& back() { return lastInsert->val; }
const_reference& back() const { return lastInsert->val; }
@@ -88,18 +88,20 @@ public:
void remove_if(Predicate pred)
{
Node* prev = nullptr;
- Node* ptr = first;
+ Node* ptr = firstInsert;
while (ptr)
if (pred(ptr->val))
{
- Node* tmp = ptr->next;
+ Node* next = ptr->next;
deleteNode(ptr);
+ ptr = next;
+
if (prev)
- prev->next = ptr = tmp;
+ prev->next = next;
else
- first = ptr = tmp;
- if (!tmp)
+ firstInsert = next;
+ if (!next)
lastInsert = prev;
}
else
@@ -111,19 +113,19 @@ public:
void clear()
{
- Node* ptr = first;
+ Node* ptr = firstInsert;
while (ptr)
{
- Node* tmp = ptr;
- ptr = ptr->next;
- delete tmp;
+ Node* next = ptr->next;
+ deleteNode(ptr);
+ ptr = next;
}
- first = lastInsert = nullptr;
- sz = 0;
+ firstInsert = lastInsert = nullptr;
+ assert(sz == 0);
}
- bool empty() const { return first == nullptr; }
+ bool empty() const { return firstInsert == nullptr; }
size_t size() const { return sz; }
private:
@@ -132,11 +134,10 @@ private:
void pushNode(Node* newNode) //throw()
{
- ++sz;
if (lastInsert == nullptr)
{
- assert(first == nullptr);
- first = lastInsert = newNode;
+ assert(firstInsert == nullptr && sz == 0);
+ firstInsert = lastInsert = newNode;
}
else
{
@@ -144,6 +145,7 @@ private:
lastInsert->next = newNode;
lastInsert = newNode;
}
+ ++sz;
}
void deleteNode(Node* oldNode)
@@ -153,7 +155,7 @@ private:
delete oldNode;
}
- Node* first;
+ Node* firstInsert;
Node* lastInsert; //point to last insertion; required by efficient emplace_back()
size_t sz;
};
diff --git a/zen/format_unit.cpp b/zen/format_unit.cpp
index 4b39d5a9..1568b616 100644
--- a/zen/format_unit.cpp
+++ b/zen/format_unit.cpp
@@ -287,11 +287,12 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime)
auto errorMsg = [&] { return _("Error") + L" (time_t: " + numberTo<std::wstring>(utcTime) + L")"; };
#ifdef ZEN_WIN
- FILETIME lastWriteTimeUtc = tofiletime(utcTime); //convert ansi C time to FILETIME
+ FILETIME lastWriteTimeUtc = toFileTime(utcTime); //convert ansi C time to FILETIME
SYSTEMTIME systemTimeLocal = {};
- if (useNewLocalTimeCalculation) //use DST setting from source date (like in Windows 7, see http://msdn.microsoft.com/en-us/library/ms724277(VS.85).aspx
+ //http://msdn.microsoft.com/en-us/library/ms724277(VS.85).aspx
+ if (useNewLocalTimeCalculation) //DST conversion like in Windows 7: NTFS stays fixed, but FAT jumps by one hour
{
SYSTEMTIME systemTimeUtc = {};
if (!::FileTimeToSystemTime(&lastWriteTimeUtc, //__in const FILETIME *lpFileTime,
@@ -303,7 +304,7 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime)
&systemTimeLocal)) //__out LPSYSTEMTIME lpLocalTime
return errorMsg();
}
- else //use DST setting (like in Windows 2000 and XP)
+ else //DST conversion like in Windows 2000 and XP: FAT times stay fixed, while NTFS jumps
{
FILETIME fileTimeLocal = {};
if (!::FileTimeToLocalFileTime(&lastWriteTimeUtc, //_In_ const FILETIME *lpFileTime,
diff --git a/zen/int64.h b/zen/int64.h
index 7d03f35d..6901ebeb 100644
--- a/zen/int64.h
+++ b/zen/int64.h
@@ -219,7 +219,7 @@ Int64 toTimeT(const FILETIME& ft)
}
inline
-FILETIME tofiletime(const Int64& utcTime)
+FILETIME toFileTime(const Int64& utcTime)
{
const UInt64 fileTimeLong = to<UInt64>(utcTime + Int64(3054539008UL, 2)) * 10000000U;
const FILETIME output = { fileTimeLong.getLo(), fileTimeLong.getHi() };
diff --git a/zen/recycler.cpp b/zen/recycler.cpp
index 20e1a4af..a1353f0b 100644
--- a/zen/recycler.cpp
+++ b/zen/recycler.cpp
@@ -95,7 +95,7 @@ void zen::recycleOrDelete(const std::vector<Zstring>& filenames, CallbackRecycli
replaceCpy(_("Cannot load file %x."), L"%x", fmtFileName(getDllName())));
std::vector<const wchar_t*> cNames;
- for (auto it = filenames.begin(); it != filenames.end(); ++it) //caution to not create temporary strings here!!
+ for (auto it = filenames.begin(); it != filenames.end(); ++it) //CAUTION: to not create temporary strings here!!
cNames.push_back(it->c_str());
CallbackData cbd(callback);
@@ -114,9 +114,9 @@ void zen::recycleOrDelete(const std::vector<Zstring>& filenames, CallbackRecycli
else //regular recycle bin usage: available since XP
{
Zstring filenamesDoubleNull;
- for (auto it = filenames.begin(); it != filenames.end(); ++it)
+ for (const Zstring& filename : filenames)
{
- filenamesDoubleNull += *it;
+ filenamesDoubleNull += filename;
filenamesDoubleNull += L'\0';
}
diff --git a/zenXml/Changelog.txt b/zenXml/Changelog.txt
new file mode 100644
index 00000000..8fb65daa
--- /dev/null
+++ b/zenXml/Changelog.txt
@@ -0,0 +1,79 @@
+===========
+|Changelog|
+===========
+
+zen::Xml 2.0
+------------
+Skip XML comments while parsing
+Added move constructor for XmlDoc
+zen::parse and zen::load directly return XmlDoc
+New macros to specify platform: ZEN_WIN, ZEN_LINUX, ZEN_MAC
+Support serializing all integer limits (INT_MIN, INT_MAX, ect.)
+
+
+zen::Xml 1.9
+------------
+Mark failed UTF conversions with replacement character
+zen library update
+revised documentation
+
+
+zen::Xml 1.8
+------------
+Allow element values to contain non-escaped quotation marks
+Respect Linux/Mac/Window line endings when calculating parsing error location
+Map all end-of-line characters (Win/Linux/Mac) to \n
+
+
+zen::Xml 1.7
+------------
+zen library update
+revised documentation
+
+
+zen::Xml 1.6
+------------
+Fixed header file circular dependency
+Improved performance of FILE* based I/O
+Updated zen libraries
+
+
+zen::Xml 1.5
+------------
+Replaced sscanf/sprintf hex conversions: speedup of factors 3000 and 3 for large inputs
+MinGW: Improved char-based string to floating point conversion by factor 10
+Fixed crash in UTF8 conversion when processing corrupted data
+Fixed MSVC security warnings
+
+
+zen::Xml 1.4
+------------
+Added missing include
+
+
+zen::Xml 1.3
+------------
+Improved template metaprogramming implementation
+Support unusual string classes: Glib::ustring, wxString (wxWidgets >= 2.9)
+A number of documentation fixes
+
+
+zen::Xml 1.2
+------------
+Design improvements and minor refactoring
+Removed Loki dependency
+
+
+zen::Xml 1.1
+------------
+A few minor fixes
+
+
+zen::Xml 1.0
+------------
+Initial release:
+- straightforward XML serialization
+- automatic UTF-8 conversion
+- convert all string-like types
+- convert all built-in numbers
+- support STL containers
diff --git a/zenxml/LICENSE_1_0.txt b/zenxml/LICENSE_1_0.txt
new file mode 100644
index 00000000..36b7cd93
--- /dev/null
+++ b/zenxml/LICENSE_1_0.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/zenxml/doc/annotated.html b/zenxml/doc/annotated.html
new file mode 100644
index 00000000..b5e05616
--- /dev/null
+++ b/zenxml/doc/annotated.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Class List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><table>
+ <tr><td class="indexkey"><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td class="indexvalue">The complete XML document </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td class="indexvalue">An XML element </td></tr>
+ <tr><td class="indexkey"><a class="el" href="structzen_1_1_xml_error.html">zen::XmlError</a></td><td class="indexvalue">Exception base class for zen::Xml </td></tr>
+ <tr><td class="indexkey"><a class="el" href="structzen_1_1_xml_file_error.html">zen::XmlFileError</a></td><td class="indexvalue">Exception thrown due to failed file I/O </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td class="indexvalue">Proxy class to conveniently convert XML structure to user data </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></td><td class="indexvalue">Proxy class to conveniently convert user data into XML structure </td></tr>
+ <tr><td class="indexkey"><a class="el" href="structzen_1_1_xml_parsing_error.html">zen::XmlParsingError</a></td><td class="indexvalue">Exception thrown due to an XML parsing error </td></tr>
+</table>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/bc_s.png b/zenxml/doc/bc_s.png
new file mode 100644
index 00000000..51ba0066
--- /dev/null
+++ b/zenxml/doc/bc_s.png
Binary files differ
diff --git a/zenxml/doc/bdwn.png b/zenxml/doc/bdwn.png
new file mode 100644
index 00000000..d0b575b7
--- /dev/null
+++ b/zenxml/doc/bdwn.png
Binary files differ
diff --git a/zenxml/doc/bind_8h_source.html b/zenxml/doc/bind_8h_source.html
new file mode 100644
index 00000000..300a10aa
--- /dev/null
+++ b/zenxml/doc/bind_8h_source.html
@@ -0,0 +1,319 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: bind.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">bind.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_BIND_HEADER_9081740816593478258435</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_BIND_HEADER_9081740816593478258435</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;set&gt;</span>
+<a name="l00011"></a>00011 <span class="preprocessor">#include &quot;cvrt_struc.h&quot;</span>
+<a name="l00012"></a>00012 <span class="preprocessor">#include &quot;parser.h&quot;</span>
+<a name="l00013"></a>00013 <span class="preprocessor">#include &quot;io.h&quot;</span>
+<a name="l00014"></a>00014
+<a name="l00015"></a><a class="code" href="namespacezen.html">00015</a> <span class="keyword">namespace </span>zen
+<a name="l00016"></a>00016 {
+<a name="l00022"></a>00022
+<a name="l00023"></a>00023
+<a name="l00032"></a>00032 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt; <span class="keyword">inline</span>
+<a name="l00033"></a><a class="code" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee">00033</a> <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee" title="Load XML document from a file.">load</a>(<span class="keyword">const</span> String&amp; filename, <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; doc) <span class="comment">//throw XmlFileError, XmlParsingError</span>
+<a name="l00034"></a>00034 {
+<a name="l00035"></a>00035 std::string stream = <a class="code" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607" title="Load byte stream from a file.">loadStream</a>(filename); <span class="comment">//throw XmlFileError</span>
+<a name="l00036"></a>00036 <a class="code" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7" title="Load XML document from a byte stream.">parse</a>(stream, doc); <span class="comment">//throw XmlParsingError</span>
+<a name="l00037"></a>00037 }
+<a name="l00038"></a>00038
+<a name="l00039"></a>00039
+<a name="l00041"></a>00041
+<a name="l00051"></a>00051 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt; <span class="keyword">inline</span>
+<a name="l00052"></a><a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d">00052</a> <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d" title="Save XML document to a file.">save</a>(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; doc,
+<a name="l00053"></a>00053 <span class="keyword">const</span> String&amp; filename,
+<a name="l00054"></a>00054 <span class="keyword">const</span> std::string&amp; lineBreak = <span class="stringliteral">&quot;\r\n&quot;</span>,
+<a name="l00055"></a>00055 <span class="keyword">const</span> std::string&amp; indent = <span class="stringliteral">&quot; &quot;</span>) <span class="comment">//throw XmlFileError</span>
+<a name="l00056"></a>00056 {
+<a name="l00057"></a>00057 std::string stream = <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(doc, lineBreak, indent); <span class="comment">//throw ()</span>
+<a name="l00058"></a>00058 <a class="code" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2" title="Save byte stream to a file.">saveStream</a>(stream, filename); <span class="comment">//throw XmlFileError</span>
+<a name="l00059"></a>00059 }
+<a name="l00060"></a>00060
+<a name="l00061"></a>00061
+<a name="l00063"></a><a class="code" href="classzen_1_1_xml_out.html">00063</a> <span class="keyword">class </span><a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">XmlOut</a>
+<a name="l00064"></a>00064 {
+<a name="l00065"></a>00065 <span class="keyword">public</span>:
+<a name="l00067"></a>00067
+<a name="l00088"></a><a class="code" href="classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc">00088</a> <a class="code" href="classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc" title="Construct an output proxy for an XML document.">XmlOut</a>(<a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; doc) : ref_(&amp;doc.root()) {}
+<a name="l00090"></a>00090
+<a name="l00093"></a><a class="code" href="classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0">00093</a> <a class="code" href="classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0" title="Construct an output proxy for a single XML element.">XmlOut</a>(<a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; element) : ref_(&amp;element) {}
+<a name="l00094"></a>00094
+<a name="l00096"></a>00096
+<a name="l00101"></a>00101 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00102"></a><a class="code" href="classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831">00102</a> <a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">XmlOut</a> <a class="code" href="classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831" title="Retrieve a handle to an XML child element for writing.">operator[]</a>(<span class="keyword">const</span> String&amp; name)<span class="keyword"> const</span>
+<a name="l00103"></a>00103 <span class="keyword"> </span>{
+<a name="l00104"></a>00104 <span class="keyword">const</span> std::string utf8name = utfCvrtTo&lt;std::string&gt;(name);
+<a name="l00105"></a>00105 <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* child = ref_-&gt;<a class="code" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e" title="Retrieve a child element with the given name.">getChild</a>(utf8name);
+<a name="l00106"></a>00106 <span class="keywordflow">return</span> child ? *child : ref_-&gt;<a class="code" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9" title="Create a new child element and return a reference to it.">addChild</a>(utf8name);
+<a name="l00107"></a>00107 }
+<a name="l00108"></a>00108
+<a name="l00110"></a>00110
+<a name="l00114"></a>00114 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00115"></a><a class="code" href="classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb">00115</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb" title="Write user data to the underlying XML element.">operator()</a>(<span class="keyword">const</span> T&amp; value) { <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(value, *ref_); }
+<a name="l00116"></a>00116
+<a name="l00118"></a>00118
+<a name="l00142"></a>00142 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String, <span class="keyword">class</span> T&gt;
+<a name="l00143"></a><a class="code" href="classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805">00143</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805" title="Write user data to an XML attribute.">attribute</a>(<span class="keyword">const</span> String&amp; name, <span class="keyword">const</span> T&amp; value) { ref_-&gt;<a class="code" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421" title="Create or update an XML attribute.">setAttribute</a>(name, value); }
+<a name="l00144"></a>00144
+<a name="l00146"></a><a class="code" href="classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2">00146</a> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; <a class="code" href="classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2" title="Return a reference to the underlying Xml element.">ref</a>() { <span class="keywordflow">return</span> *ref_; }
+<a name="l00147"></a>00147
+<a name="l00148"></a>00148 <span class="keyword">private</span>:
+<a name="l00149"></a>00149 <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* ref_; <span class="comment">//always bound!</span>
+<a name="l00150"></a>00150 };
+<a name="l00151"></a>00151
+<a name="l00152"></a>00152
+<a name="l00154"></a><a class="code" href="classzen_1_1_xml_in.html">00154</a> <span class="keyword">class </span><a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">XmlIn</a>
+<a name="l00155"></a>00155 {
+<a name="l00156"></a>00156 <span class="keyword">class </span>ErrorLog;
+<a name="l00157"></a>00157 <span class="keyword">struct </span>ConversionToBool { <span class="keywordtype">int</span> dummy; };
+<a name="l00158"></a>00158
+<a name="l00159"></a>00159 <span class="keyword">public</span>:
+<a name="l00161"></a>00161
+<a name="l00171"></a><a class="code" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f">00171</a> <a class="code" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn</a>(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; doc) : refIndex(0), log(std::make_shared&lt;ErrorLog&gt;()) { refList.push_back(&amp;doc.<a class="code" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d" title="Get a const reference to the document&#39;s root element.">root</a>()); }
+<a name="l00173"></a>00173
+<a name="l00176"></a><a class="code" href="classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430">00176</a> <a class="code" href="classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430" title="Construct an input proxy for a single XML element, may be nullptr.">XmlIn</a>(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* element) : refIndex(0), log(std::make_shared&lt;ErrorLog&gt;()) { refList.push_back(element); }
+<a name="l00178"></a>00178
+<a name="l00181"></a><a class="code" href="classzen_1_1_xml_in.html#a33de75412df69cb25e0fd8b3bc70c9f8">00181</a> <a class="code" href="classzen_1_1_xml_in.html#a33de75412df69cb25e0fd8b3bc70c9f8" title="Construct an input proxy for a single XML element.">XmlIn</a>(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; element) : refIndex(0), log(std::make_shared&lt;ErrorLog&gt;()) { refList.push_back(&amp;element); }
+<a name="l00182"></a>00182
+<a name="l00184"></a>00184
+<a name="l00189"></a>00189 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00190"></a><a class="code" href="classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d">00190</a> <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">XmlIn</a> <a class="code" href="classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d" title="Retrieve a handle to an XML child element for reading.">operator[]</a>(<span class="keyword">const</span> String&amp; name)<span class="keyword"> const</span>
+<a name="l00191"></a>00191 <span class="keyword"> </span>{
+<a name="l00192"></a>00192 std::vector&lt;const XmlElement*&gt; childList;
+<a name="l00193"></a>00193
+<a name="l00194"></a>00194 <span class="keywordflow">if</span> (refIndex &lt; refList.size())
+<a name="l00195"></a>00195 {
+<a name="l00196"></a>00196 <span class="keyword">auto</span> iterPair = refList[refIndex]-&gt;getChildren(name);
+<a name="l00197"></a>00197 std::for_each(iterPair.first, iterPair.second,
+<a name="l00198"></a>00198 [&amp;](<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; child) { childList.push_back(&amp;child); });
+<a name="l00199"></a>00199 }
+<a name="l00200"></a>00200
+<a name="l00201"></a>00201 <span class="keywordflow">return</span> <a class="code" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn</a>(childList, childList.empty() ? getChildNameFormatted(name) : std::string(), log);
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203
+<a name="l00205"></a>00205
+<a name="l00225"></a><a class="code" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4">00225</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4" title="Refer to next sibling element with the same name.">next</a>() { ++refIndex; }
+<a name="l00226"></a>00226
+<a name="l00228"></a>00228
+<a name="l00233"></a>00233 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00234"></a><a class="code" href="classzen_1_1_xml_in.html#a98cc59f687c89549381e76105f8fb506">00234</a> <span class="keywordtype">bool</span> operator()(T&amp; value)<span class="keyword"> const</span>
+<a name="l00235"></a>00235 <span class="keyword"> </span>{
+<a name="l00236"></a>00236 <span class="keywordflow">if</span> (refIndex &lt; refList.size())
+<a name="l00237"></a>00237 {
+<a name="l00238"></a>00238 <span class="keywordtype">bool</span> success = <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(*refList[refIndex], value);
+<a name="l00239"></a>00239 <span class="keywordflow">if</span> (!success)
+<a name="l00240"></a>00240 log-&gt;notifyConversionError(getNameFormatted());
+<a name="l00241"></a>00241 <span class="keywordflow">return</span> success;
+<a name="l00242"></a>00242 }
+<a name="l00243"></a>00243 <span class="keywordflow">else</span>
+<a name="l00244"></a>00244 {
+<a name="l00245"></a>00245 log-&gt;notifyMissingElement(getNameFormatted());
+<a name="l00246"></a>00246 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00247"></a>00247 }
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249
+<a name="l00251"></a>00251
+<a name="l00268"></a>00268 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String, <span class="keyword">class</span> T&gt;
+<a name="l00269"></a><a class="code" href="classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01">00269</a> <span class="keywordtype">bool</span> attribute(<span class="keyword">const</span> String&amp; name, T&amp; value)<span class="keyword"> const</span>
+<a name="l00270"></a>00270 <span class="keyword"> </span>{
+<a name="l00271"></a>00271 <span class="keywordflow">if</span> (refIndex &lt; refList.size())
+<a name="l00272"></a>00272 {
+<a name="l00273"></a>00273 <span class="keywordtype">bool</span> success = refList[refIndex]-&gt;getAttribute(name, value);
+<a name="l00274"></a>00274 <span class="keywordflow">if</span> (!success)
+<a name="l00275"></a>00275 log-&gt;notifyMissingAttribute(getNameFormatted(), utfCvrtTo&lt;std::string&gt;(name));
+<a name="l00276"></a>00276 <span class="keywordflow">return</span> success;
+<a name="l00277"></a>00277 }
+<a name="l00278"></a>00278 <span class="keywordflow">else</span>
+<a name="l00279"></a>00279 {
+<a name="l00280"></a>00280 log-&gt;notifyMissingElement(getNameFormatted());
+<a name="l00281"></a>00281 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00282"></a>00282 }
+<a name="l00283"></a>00283 }
+<a name="l00284"></a>00284
+<a name="l00286"></a><a class="code" href="classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f">00286</a> <span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* <span class="keyword">get</span>() <span class="keyword">const</span> { <span class="keywordflow">return</span> refIndex &lt; refList.size() ? refList[refIndex] : <span class="keyword">nullptr</span>; }
+<a name="l00287"></a>00287
+<a name="l00289"></a>00289
+<a name="l00298"></a><a class="code" href="classzen_1_1_xml_in.html#a954950849b52557369932ab2a8b4ad72">00298</a> operator int ConversionToBool::* ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">get</span>() ? &amp;ConversionToBool::dummy : <span class="keyword">nullptr</span>; }
+<a name="l00299"></a>00299
+<a name="l00301"></a>00301
+<a name="l00320"></a><a class="code" href="classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a">00320</a> <span class="keywordtype">bool</span> <a class="code" href="classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a" title="Notifies errors while mapping the XML to user data.">errorsOccured</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !log-&gt;elementList().empty(); }
+<a name="l00321"></a>00321
+<a name="l00323"></a>00323
+<a name="l00327"></a>00327 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00328"></a><a class="code" href="classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e">00328</a> std::vector&lt;String&gt; getErrorsAs()<span class="keyword"> const</span>
+<a name="l00329"></a>00329 <span class="keyword"> </span>{
+<a name="l00330"></a>00330 std::vector&lt;String&gt; output;
+<a name="l00331"></a>00331 <span class="keyword">const</span> <span class="keyword">auto</span>&amp; elements = log-&gt;elementList();
+<a name="l00332"></a>00332 std::transform(elements.begin(), elements.end(), std::back_inserter(output), [](<span class="keyword">const</span> std::string&amp; str) { <span class="keywordflow">return</span> utfCvrtTo&lt;String&gt;(str); });
+<a name="l00333"></a>00333 <span class="keywordflow">return</span> output;
+<a name="l00334"></a>00334 }
+<a name="l00335"></a>00335
+<a name="l00336"></a>00336 <span class="keyword">private</span>:
+<a name="l00337"></a>00337 <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">XmlIn</a>(<span class="keyword">const</span> std::vector&lt;const XmlElement*&gt;&amp; siblingList, <span class="keyword">const</span> std::string&amp; elementNameFmt, <span class="keyword">const</span> std::shared_ptr&lt;ErrorLog&gt;&amp; sharedlog) :
+<a name="l00338"></a>00338 refList(siblingList), refIndex(0), formattedName(elementNameFmt), log(sharedlog)
+<a name="l00339"></a>00339 { assert((!siblingList.empty() &amp;&amp; elementNameFmt.empty()) || (siblingList.empty() &amp;&amp; !elementNameFmt.empty())); }
+<a name="l00340"></a>00340
+<a name="l00341"></a>00341 <span class="keyword">static</span> std::string getNameFormatted(<span class="keyword">const</span> XmlElement&amp; elem) <span class="comment">//&quot;&lt;Root&gt; &lt;Level1&gt; &lt;Level2&gt;&quot;</span>
+<a name="l00342"></a>00342 {
+<a name="l00343"></a>00343 <span class="keywordflow">return</span> (elem.parent() ? getNameFormatted(*elem.parent()) + <span class="stringliteral">&quot; &quot;</span> : std::string()) + <span class="stringliteral">&quot;&lt;&quot;</span> + elem.getNameAs&lt;std::string&gt;() + <span class="stringliteral">&quot;&gt;&quot;</span>;
+<a name="l00344"></a>00344 }
+<a name="l00345"></a>00345
+<a name="l00346"></a>00346 std::string getNameFormatted()<span class="keyword"> const</span>
+<a name="l00347"></a>00347 <span class="keyword"> </span>{
+<a name="l00348"></a>00348 <span class="keywordflow">if</span> (refIndex &lt; refList.size())
+<a name="l00349"></a>00349 {
+<a name="l00350"></a>00350 assert(formattedName.empty());
+<a name="l00351"></a>00351 <span class="keywordflow">return</span> getNameFormatted(*refList[refIndex]);
+<a name="l00352"></a>00352 }
+<a name="l00353"></a>00353 <span class="keywordflow">else</span>
+<a name="l00354"></a>00354 <span class="keywordflow">return</span> formattedName;
+<a name="l00355"></a>00355 }
+<a name="l00356"></a>00356
+<a name="l00357"></a>00357 std::string getChildNameFormatted(<span class="keyword">const</span> std::string&amp; childName)<span class="keyword"> const</span>
+<a name="l00358"></a>00358 <span class="keyword"> </span>{
+<a name="l00359"></a>00359 std::string parentName = getNameFormatted();
+<a name="l00360"></a>00360 <span class="keywordflow">return</span> (parentName.empty() ? std::string() : (parentName + <span class="stringliteral">&quot; &quot;</span>)) + <span class="stringliteral">&quot;&lt;&quot;</span> + childName + <span class="stringliteral">&quot;&gt;&quot;</span>;
+<a name="l00361"></a>00361 }
+<a name="l00362"></a>00362
+<a name="l00363"></a>00363 <span class="keyword">class </span>ErrorLog
+<a name="l00364"></a>00364 {
+<a name="l00365"></a>00365 <span class="keyword">public</span>:
+<a name="l00366"></a>00366 <span class="keywordtype">void</span> notifyConversionError (<span class="keyword">const</span> std::string&amp; formattedName) { insert(formattedName); }
+<a name="l00367"></a>00367 <span class="keywordtype">void</span> notifyMissingElement (<span class="keyword">const</span> std::string&amp; formattedName) { insert(formattedName); }
+<a name="l00368"></a>00368 <span class="keywordtype">void</span> notifyMissingAttribute(<span class="keyword">const</span> std::string&amp; formattedName, <span class="keyword">const</span> std::string&amp; attribName) { insert(formattedName + <span class="stringliteral">&quot; @&quot;</span> + attribName); }
+<a name="l00369"></a>00369
+<a name="l00370"></a>00370 <span class="keyword">const</span> std::vector&lt;std::string&gt;&amp; elementList()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> failedElements; }
+<a name="l00371"></a>00371
+<a name="l00372"></a>00372 <span class="keyword">private</span>:
+<a name="l00373"></a>00373 <span class="keywordtype">void</span> insert(<span class="keyword">const</span> std::string&amp; newVal)
+<a name="l00374"></a>00374 {
+<a name="l00375"></a>00375 <span class="keywordflow">if</span> (usedElements.insert(newVal).second)
+<a name="l00376"></a>00376 failedElements.push_back(newVal);
+<a name="l00377"></a>00377 }
+<a name="l00378"></a>00378
+<a name="l00379"></a>00379 std::vector&lt;std::string&gt; failedElements; <span class="comment">//unique list of failed elements</span>
+<a name="l00380"></a>00380 std::set&lt;std::string&gt; usedElements;
+<a name="l00381"></a>00381 };
+<a name="l00382"></a>00382
+<a name="l00383"></a>00383 std::vector&lt;const XmlElement*&gt; refList; <span class="comment">//all sibling elements with same name (all pointers bound!)</span>
+<a name="l00384"></a>00384 <span class="keywordtype">size_t</span> refIndex; <span class="comment">//this sibling&#39;s index in refList</span>
+<a name="l00385"></a>00385 std::string formattedName; <span class="comment">//contains full and formatted element name if (and only if) refList is empty</span>
+<a name="l00386"></a>00386 std::shared_ptr&lt;ErrorLog&gt; log; <span class="comment">//always bound</span>
+<a name="l00387"></a>00387 };
+<a name="l00388"></a>00388 }
+<a name="l00389"></a>00389
+<a name="l00390"></a>00390 <span class="preprocessor">#endif //ZEN_XML_BIND_HEADER_9081740816593478258435</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classes.html b/zenxml/doc/classes.html
new file mode 100644
index 00000000..4670ccf3
--- /dev/null
+++ b/zenxml/doc/classes.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Class Index</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li class="current"><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Index</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_X">X</a></div>
+<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td rowspan="2" valign="bottom"><a name="letter_X"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;X&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> (<a class="el" href="namespacezen.html">zen</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structzen_1_1_xml_file_error.html">XmlFileError</a> (<a class="el" href="namespacezen.html">zen</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classzen_1_1_xml_out.html">XmlOut</a> (<a class="el" href="namespacezen.html">zen</a>)&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structzen_1_1_xml_error.html">XmlError</a> (<a class="el" href="namespacezen.html">zen</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classzen_1_1_xml_in.html">XmlIn</a> (<a class="el" href="namespacezen.html">zen</a>)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structzen_1_1_xml_parsing_error.html">XmlParsingError</a> (<a class="el" href="namespacezen.html">zen</a>)&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> (<a class="el" href="namespacezen.html">zen</a>)&#160;&#160;&#160;</td><td></td><td></td><td></td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_X">X</a></div>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_doc-members.html b/zenxml/doc/classzen_1_1_xml_doc-members.html
new file mode 100644
index 00000000..4a936065
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_doc-members.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Member List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlDoc Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a>, including all inherited members.<table>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da">getEncodingAs</a>() const </td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4">getStandaloneAs</a>() const </td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665">getVersionAs</a>() const </td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d">root</a>() const </td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#a094e156f9d265443e52a527638e88a1e">root</a>()</td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62">setEncoding</a>(const String &amp;encoding)</td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4">setStandalone</a>(const String &amp;standalone)</td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64">setVersion</a>(const String &amp;version)</td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed">XmlDoc</a>()</td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_doc.html#a74ff8434848672fe6483845d04c082df">XmlDoc</a>(String rootName)</td><td><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></td><td></td></tr>
+</table></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_doc.html b/zenxml/doc/classzen_1_1_xml_doc.html
new file mode 100644
index 00000000..80e05844
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_doc.html
@@ -0,0 +1,353 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen::XmlDoc Class Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zen::XmlDoc Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>The complete XML document.
+ <a href="classzen_1_1_xml_doc.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="dom_8h_source.html">dom.h</a>&gt;</code></p>
+
+<p><a href="classzen_1_1_xml_doc-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:adbed9c31066d456a9cc8c610f15670ed"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adbed9c31066d456a9cc8c610f15670ed"></a>
+&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed">XmlDoc</a> ()</td></tr>
+<tr class="memdesc:adbed9c31066d456a9cc8c610f15670ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default constructor setting up an empty XML document with a standard declaration: &lt;?xml version="1.0" encoding="UTF-8" ?&gt; <br/></td></tr>
+<tr class="memitem:a74ff8434848672fe6483845d04c082df"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a74ff8434848672fe6483845d04c082df"><td class="memTemplItemLeft" align="right" valign="top">&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#a74ff8434848672fe6483845d04c082df">XmlDoc</a> (String rootName)</td></tr>
+<tr class="memitem:ad4a9594d93885fc1a12db28e8246648d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad4a9594d93885fc1a12db28e8246648d"></a>
+const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d">root</a> () const </td></tr>
+<tr class="memdesc:ad4a9594d93885fc1a12db28e8246648d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a const reference to the document's root element. <br/></td></tr>
+<tr class="memitem:a094e156f9d265443e52a527638e88a1e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a094e156f9d265443e52a527638e88a1e"></a>
+<a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#a094e156f9d265443e52a527638e88a1e">root</a> ()</td></tr>
+<tr class="memdesc:a094e156f9d265443e52a527638e88a1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a reference to the document's root element. <br/></td></tr>
+<tr class="memitem:a7f93dcdc00cdc8d98926cf8e47161665"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a7f93dcdc00cdc8d98926cf8e47161665"><td class="memTemplItemLeft" align="right" valign="top">String&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665">getVersionAs</a> () const </td></tr>
+<tr class="memdesc:a7f93dcdc00cdc8d98926cf8e47161665"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the version used in the XML declaration. <a href="#a7f93dcdc00cdc8d98926cf8e47161665"></a><br/></td></tr>
+<tr class="memitem:ab45914339c476e1da35746f5e00dbc64"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:ab45914339c476e1da35746f5e00dbc64"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64">setVersion</a> (const String &amp;version)</td></tr>
+<tr class="memdesc:ab45914339c476e1da35746f5e00dbc64"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the version used in the XML declaration. <a href="#ab45914339c476e1da35746f5e00dbc64"></a><br/></td></tr>
+<tr class="memitem:a64ece4a1f3f8c802192b8f31506535da"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a64ece4a1f3f8c802192b8f31506535da"><td class="memTemplItemLeft" align="right" valign="top">String&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da">getEncodingAs</a> () const </td></tr>
+<tr class="memdesc:a64ece4a1f3f8c802192b8f31506535da"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the encoding used in the XML declaration. <a href="#a64ece4a1f3f8c802192b8f31506535da"></a><br/></td></tr>
+<tr class="memitem:a2ae30bca2f490479f58c272148935a62"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a2ae30bca2f490479f58c272148935a62"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62">setEncoding</a> (const String &amp;encoding)</td></tr>
+<tr class="memdesc:a2ae30bca2f490479f58c272148935a62"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the encoding used in the XML declaration. <a href="#a2ae30bca2f490479f58c272148935a62"></a><br/></td></tr>
+<tr class="memitem:ac1bfb9776852dc8195b9ffb4f65452e4"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:ac1bfb9776852dc8195b9ffb4f65452e4"><td class="memTemplItemLeft" align="right" valign="top">String&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4">getStandaloneAs</a> () const </td></tr>
+<tr class="memdesc:ac1bfb9776852dc8195b9ffb4f65452e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the standalone string used in the XML declaration. <a href="#ac1bfb9776852dc8195b9ffb4f65452e4"></a><br/></td></tr>
+<tr class="memitem:a4c92f9b8c1bb47247b827d89794590d4"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a4c92f9b8c1bb47247b827d89794590d4"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4">setStandalone</a> (const String &amp;standalone)</td></tr>
+<tr class="memdesc:a4c92f9b8c1bb47247b827d89794590d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the standalone string used in the XML declaration. <a href="#a4c92f9b8c1bb47247b827d89794590d4"></a><br/></td></tr>
+</table>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>The complete XML document. </p>
+</div><hr/><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a74ff8434848672fe6483845d04c082df"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed">zen::XmlDoc::XmlDoc</a> </td>
+ <td>(</td>
+ <td class="paramtype">String&#160;</td>
+ <td class="paramname"><em>rootName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">rootName</td><td>The name of the XML document's root element. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a64ece4a1f3f8c802192b8f31506535da"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">String <a class="el" href="classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da">zen::XmlDoc::getEncodingAs</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Get the encoding used in the XML declaration. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string class: e.g. std::string, std::wstring, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ac1bfb9776852dc8195b9ffb4f65452e4"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">String <a class="el" href="classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4">zen::XmlDoc::getStandaloneAs</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Get the standalone string used in the XML declaration. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string class: e.g. std::string, std::wstring, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a7f93dcdc00cdc8d98926cf8e47161665"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">String <a class="el" href="classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665">zen::XmlDoc::getVersionAs</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Get the version used in the XML declaration. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string class: e.g. std::string, std::wstring, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a2ae30bca2f490479f58c272148935a62"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62">zen::XmlDoc::setEncoding</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>encoding</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Set the encoding used in the XML declaration. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a4c92f9b8c1bb47247b827d89794590d4"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4">zen::XmlDoc::setStandalone</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>standalone</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Set the standalone string used in the XML declaration. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ab45914339c476e1da35746f5e00dbc64"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64">zen::XmlDoc::setVersion</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>version</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Set the version used in the XML declaration. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_element-members.html b/zenxml/doc/classzen_1_1_xml_element-members.html
new file mode 100644
index 00000000..bccd92d1
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_element-members.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Member List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlElement Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a>, including all inherited members.<table>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9">addChild</a>(const String &amp;name)</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887">getAttribute</a>(const String &amp;name, T &amp;value) const </td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e">getChild</a>(const String &amp;name) const </td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a5d672e8ccc7592442ab927bb267af658">getChild</a>(const String &amp;name)</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8">getChildren</a>(const String &amp;name) const </td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#ae209dac9655bc36121abb87688ece41d">getChildren</a>(const String &amp;name)</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a55a6d1849490d82ae900cd9b923908f2">getChildren</a>() const </td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96">getChildren</a>()</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50">getNameAs</a>() const </td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070">getValue</a>(T &amp;value) const </td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1">parent</a>()</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a7ba1f26be5629f89ba7648d658f7058c">parent</a>() const </td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934">removeAttribute</a>(const String &amp;name)</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421">setAttribute</a>(const String &amp;name, const T &amp;value)</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01">setValue</a>(const T &amp;value)</td><td><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></td><td></td></tr>
+</table></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_element.html b/zenxml/doc/classzen_1_1_xml_element.html
new file mode 100644
index 00000000..fc87396a
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_element.html
@@ -0,0 +1,552 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen::XmlElement Class Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zen::XmlElement Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>An XML element.
+ <a href="classzen_1_1_xml_element.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="dom_8h_source.html">dom.h</a>&gt;</code></p>
+
+<p><a href="classzen_1_1_xml_element-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a7c911eb06a59c864197b1a4098728e50"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a7c911eb06a59c864197b1a4098728e50"><td class="memTemplItemLeft" align="right" valign="top">String&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50">getNameAs</a> () const </td></tr>
+<tr class="memdesc:a7c911eb06a59c864197b1a4098728e50"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve the name of this XML element. <a href="#a7c911eb06a59c864197b1a4098728e50"></a><br/></td></tr>
+<tr class="memitem:a5ac9d586a5668c2c64e3c06c6203b070"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:a5ac9d586a5668c2c64e3c06c6203b070"><td class="memTemplItemLeft" align="right" valign="top">bool&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070">getValue</a> (T &amp;value) const </td></tr>
+<tr class="memdesc:a5ac9d586a5668c2c64e3c06c6203b070"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the value of this element as a user type. <a href="#a5ac9d586a5668c2c64e3c06c6203b070"></a><br/></td></tr>
+<tr class="memitem:aaf3a26f6199fc88cce7d9d911ba21b01"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:aaf3a26f6199fc88cce7d9d911ba21b01"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01">setValue</a> (const T &amp;value)</td></tr>
+<tr class="memdesc:aaf3a26f6199fc88cce7d9d911ba21b01"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the value of this element. <a href="#aaf3a26f6199fc88cce7d9d911ba21b01"></a><br/></td></tr>
+<tr class="memitem:af90ac6f435b03ba37cf47ee188c58887"><td class="memTemplParams" colspan="2">template&lt;class String , class T &gt; </td></tr>
+<tr class="memitem:af90ac6f435b03ba37cf47ee188c58887"><td class="memTemplItemLeft" align="right" valign="top">bool&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887">getAttribute</a> (const String &amp;name, T &amp;value) const </td></tr>
+<tr class="memdesc:af90ac6f435b03ba37cf47ee188c58887"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve an attribute by name. <a href="#af90ac6f435b03ba37cf47ee188c58887"></a><br/></td></tr>
+<tr class="memitem:a211a6f037c22a54d3facb7a8347a8421"><td class="memTemplParams" colspan="2">template&lt;class String , class T &gt; </td></tr>
+<tr class="memitem:a211a6f037c22a54d3facb7a8347a8421"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421">setAttribute</a> (const String &amp;name, const T &amp;value)</td></tr>
+<tr class="memdesc:a211a6f037c22a54d3facb7a8347a8421"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create or update an XML attribute. <a href="#a211a6f037c22a54d3facb7a8347a8421"></a><br/></td></tr>
+<tr class="memitem:ad9c2ce2e55294c8110825988595e3934"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:ad9c2ce2e55294c8110825988595e3934"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934">removeAttribute</a> (const String &amp;name)</td></tr>
+<tr class="memdesc:ad9c2ce2e55294c8110825988595e3934"><td class="mdescLeft">&#160;</td><td class="mdescRight">Remove the attribute with the given name. <a href="#ad9c2ce2e55294c8110825988595e3934"></a><br/></td></tr>
+<tr class="memitem:a653caffa6fad89db7d14f67f987ad0f9"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a653caffa6fad89db7d14f67f987ad0f9"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9">addChild</a> (const String &amp;name)</td></tr>
+<tr class="memdesc:a653caffa6fad89db7d14f67f987ad0f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a new child element and return a reference to it. <a href="#a653caffa6fad89db7d14f67f987ad0f9"></a><br/></td></tr>
+<tr class="memitem:a3ab82b1720460487f4afabcd115d0c7e"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a3ab82b1720460487f4afabcd115d0c7e"><td class="memTemplItemLeft" align="right" valign="top">const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> *&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e">getChild</a> (const String &amp;name) const </td></tr>
+<tr class="memdesc:a3ab82b1720460487f4afabcd115d0c7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve a child element with the given name. <a href="#a3ab82b1720460487f4afabcd115d0c7e"></a><br/></td></tr>
+<tr class="memitem:a5d672e8ccc7592442ab927bb267af658"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a5d672e8ccc7592442ab927bb267af658"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> *&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a5d672e8ccc7592442ab927bb267af658">getChild</a> (const String &amp;name)</td></tr>
+<tr class="memitem:a2640b438c4984f5eeb8760d82d73c5b8"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a2640b438c4984f5eeb8760d82d73c5b8"><td class="memTemplItemLeft" align="right" valign="top">std::pair&lt; ChildIterConst2, <br class="typebreak"/>
+ChildIterConst2 &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8">getChildren</a> (const String &amp;name) const </td></tr>
+<tr class="memdesc:a2640b438c4984f5eeb8760d82d73c5b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access all child elements with the given name via STL iterators. <a href="#a2640b438c4984f5eeb8760d82d73c5b8"></a><br/></td></tr>
+<tr class="memitem:ae209dac9655bc36121abb87688ece41d"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:ae209dac9655bc36121abb87688ece41d"><td class="memTemplItemLeft" align="right" valign="top">std::pair&lt; ChildIter2, ChildIter2 &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#ae209dac9655bc36121abb87688ece41d">getChildren</a> (const String &amp;name)</td></tr>
+<tr class="memitem:a55a6d1849490d82ae900cd9b923908f2"><td class="memItemLeft" align="right" valign="top">std::pair&lt; ChildIterConst, <br class="typebreak"/>
+ChildIterConst &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a55a6d1849490d82ae900cd9b923908f2">getChildren</a> () const </td></tr>
+<tr class="memdesc:a55a6d1849490d82ae900cd9b923908f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Access all child elements sequentially via STL iterators. <a href="#a55a6d1849490d82ae900cd9b923908f2"></a><br/></td></tr>
+<tr class="memitem:ac59268177d162931f937b6a7f235ad96"><td class="memItemLeft" align="right" valign="top">std::pair&lt; ChildIter, ChildIter &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96">getChildren</a> ()</td></tr>
+<tr class="memitem:a4af309f59ef09f46a559f1f0e1eac6c1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4af309f59ef09f46a559f1f0e1eac6c1"></a>
+<a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1">parent</a> ()</td></tr>
+<tr class="memdesc:a4af309f59ef09f46a559f1f0e1eac6c1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get parent XML element, may be nullptr for root element. <br/></td></tr>
+<tr class="memitem:a7ba1f26be5629f89ba7648d658f7058c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7ba1f26be5629f89ba7648d658f7058c"></a>
+const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html#a7ba1f26be5629f89ba7648d658f7058c">parent</a> () const </td></tr>
+<tr class="memdesc:a7ba1f26be5629f89ba7648d658f7058c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get parent XML element, may be nullptr for root element. <br/></td></tr>
+</table>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>An XML element. </p>
+</div><hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a653caffa6fad89db7d14f67f987ad0f9"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a>&amp; <a class="el" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9">zen::XmlElement::addChild</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Create a new child element and return a reference to it. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">name</td><td>The name of the child element to be created. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="af90ac6f435b03ba37cf47ee188c58887"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String , class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887">zen::XmlElement::getAttribute</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Retrieve an attribute by name. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ <tr><td class="paramname">T</td><td>String-convertible user data type: e.g. any string class, all built-in arithmetic numbers </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">name</td><td>The name of the attribute to retrieve. </td></tr>
+ <tr><td class="paramname">value</td><td>The value of the attribute converted to T. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>"true" if value was retrieved successfully. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a3ab82b1720460487f4afabcd115d0c7e"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a>* <a class="el" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e">zen::XmlElement::getChild</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Retrieve a child element with the given name. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">name</td><td>The name of the child element to be retrieved. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>A pointer to the child element or nullptr if none was found. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a5d672e8ccc7592442ab927bb267af658"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a>* <a class="el" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e">zen::XmlElement::getChild</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e" title="Retrieve a child element with the given name.">getChild</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a2640b438c4984f5eeb8760d82d73c5b8"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">std::pair&lt;ChildIterConst2, ChildIterConst2&gt; <a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8">zen::XmlElement::getChildren</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Access all child elements with the given name via STL iterators. </p>
+<div class="fragment"><pre class="fragment"> <span class="keyword">auto</span> iterPair = elem.getChildren(<span class="stringliteral">&quot;Item&quot;</span>);
+ std::for_each(iterPair.first, iterPair.second,
+ [](<span class="keyword">const</span> XmlElement&amp; child) { ... });
+</pre></div> <dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">name</td><td>The name of the child elements to be retrieved. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>A pair of STL begin/end iterators to access the child elements sequentially. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ae209dac9655bc36121abb87688ece41d"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">std::pair&lt;ChildIter2, ChildIter2&gt; <a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8">zen::XmlElement::getChildren</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8" title="Access all child elements with the given name via STL iterators.">getChildren</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a55a6d1849490d82ae900cd9b923908f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::pair&lt;ChildIterConst, ChildIterConst&gt; <a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8">zen::XmlElement::getChildren</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Access all child elements sequentially via STL iterators. </p>
+<div class="fragment"><pre class="fragment"> <span class="keyword">auto</span> iterPair = elem.getChildren();
+ std::for_each(iterPair.first, iterPair.second,
+ [](<span class="keyword">const</span> XmlElement&amp; child) { ... });
+</pre></div> <dl class="section return"><dt>Returns:</dt><dd>A pair of STL begin/end iterators to access all child elements sequentially. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ac59268177d162931f937b6a7f235ad96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::pair&lt;ChildIter, ChildIter&gt; <a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8">zen::XmlElement::getChildren</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8" title="Access all child elements with the given name via STL iterators.">getChildren</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a7c911eb06a59c864197b1a4098728e50"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">String <a class="el" href="classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50">zen::XmlElement::getNameAs</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Retrieve the name of this XML element. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string class: e.g. std::string, std::wstring, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>Name of the XML element. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a5ac9d586a5668c2c64e3c06c6203b070"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070">zen::XmlElement::getValue</a> </td>
+ <td>(</td>
+ <td class="paramtype">T &amp;&#160;</td>
+ <td class="paramname"><em>value</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Get the value of this element as a user type. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">T</td><td>Arbitrary user data type: e.g. any string class, all built-in arithmetic numbers, STL container, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>"true" if Xml element was successfully converted to value, cannot fail for string-like types </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ad9c2ce2e55294c8110825988595e3934"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934">zen::XmlElement::removeAttribute</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Remove the attribute with the given name. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a211a6f037c22a54d3facb7a8347a8421"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String , class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421">zen::XmlElement::setAttribute</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Create or update an XML attribute. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ <tr><td class="paramname">T</td><td>String-convertible user data type: e.g. any string-like type, all built-in arithmetic numbers </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">name</td><td>The name of the attribute to create or update. </td></tr>
+ <tr><td class="paramname">value</td><td>The value to set. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="aaf3a26f6199fc88cce7d9d911ba21b01"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01">zen::XmlElement::setValue</a> </td>
+ <td>(</td>
+ <td class="paramtype">const T &amp;&#160;</td>
+ <td class="paramname"><em>value</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Set the value of this element. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">T</td><td>Arbitrary user data type: e.g. any string-like type, all built-in arithmetic numbers, STL container, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_in-members.html b/zenxml/doc/classzen_1_1_xml_in-members.html
new file mode 100644
index 00000000..794b180d
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_in-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Member List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_in.html">XmlIn</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlIn Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a>, including all inherited members.<table>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01">attribute</a>(const String &amp;name, T &amp;value) const </td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a">errorsOccured</a>() const </td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f">get</a>() const </td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e">getErrorsAs</a>() const </td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4">next</a>()</td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a954950849b52557369932ab2a8b4ad72">operator int ConversionToBool::*</a>() const </td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a98cc59f687c89549381e76105f8fb506">operator()</a>(T &amp;value) const </td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d">operator[]</a>(const String &amp;name) const </td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f">XmlIn</a>(const XmlDoc &amp;doc)</td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430">XmlIn</a>(const XmlElement *element)</td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_in.html#a33de75412df69cb25e0fd8b3bc70c9f8">XmlIn</a>(const XmlElement &amp;element)</td><td><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></td><td></td></tr>
+</table></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_in.html b/zenxml/doc/classzen_1_1_xml_in.html
new file mode 100644
index 00000000..f1093061
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_in.html
@@ -0,0 +1,446 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen::XmlIn Class Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_in.html">XmlIn</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zen::XmlIn Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Proxy class to conveniently convert XML structure to user data.
+ <a href="classzen_1_1_xml_in.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="bind_8h_source.html">bind.h</a>&gt;</code></p>
+
+<p><a href="classzen_1_1_xml_in-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a5b48c9848e6c631a04cec2477ff85c0f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f">XmlIn</a> (const <a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;doc)</td></tr>
+<tr class="memdesc:a5b48c9848e6c631a04cec2477ff85c0f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Construct an input proxy for an XML document. <a href="#a5b48c9848e6c631a04cec2477ff85c0f"></a><br/></td></tr>
+<tr class="memitem:ae072660cde71fd4695c04d074098b430"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430">XmlIn</a> (const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> *element)</td></tr>
+<tr class="memdesc:ae072660cde71fd4695c04d074098b430"><td class="mdescLeft">&#160;</td><td class="mdescRight">Construct an input proxy for a single XML element, may be nullptr. <a href="#ae072660cde71fd4695c04d074098b430"></a><br/></td></tr>
+<tr class="memitem:a33de75412df69cb25e0fd8b3bc70c9f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a33de75412df69cb25e0fd8b3bc70c9f8">XmlIn</a> (const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;element)</td></tr>
+<tr class="memdesc:a33de75412df69cb25e0fd8b3bc70c9f8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Construct an input proxy for a single XML element. <a href="#a33de75412df69cb25e0fd8b3bc70c9f8"></a><br/></td></tr>
+<tr class="memitem:a9b38167835a28eac9a2297f35f51e53d"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a9b38167835a28eac9a2297f35f51e53d"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classzen_1_1_xml_in.html">XmlIn</a>&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d">operator[]</a> (const String &amp;name) const </td></tr>
+<tr class="memdesc:a9b38167835a28eac9a2297f35f51e53d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve a handle to an XML child element for reading. <a href="#a9b38167835a28eac9a2297f35f51e53d"></a><br/></td></tr>
+<tr class="memitem:a60cf2678c989621545d27745dcafa4a4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4">next</a> ()</td></tr>
+<tr class="memdesc:a60cf2678c989621545d27745dcafa4a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Refer to next sibling element with the same name. <a href="#a60cf2678c989621545d27745dcafa4a4"></a><br/></td></tr>
+<tr class="memitem:a98cc59f687c89549381e76105f8fb506"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:a98cc59f687c89549381e76105f8fb506"><td class="memTemplItemLeft" align="right" valign="top">bool&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a98cc59f687c89549381e76105f8fb506">operator()</a> (T &amp;value) const </td></tr>
+<tr class="memdesc:a98cc59f687c89549381e76105f8fb506"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read user data from the underlying XML element. <a href="#a98cc59f687c89549381e76105f8fb506"></a><br/></td></tr>
+<tr class="memitem:a971cd7054c551c4460d5220f6ec5cf01"><td class="memTemplParams" colspan="2">template&lt;class String , class T &gt; </td></tr>
+<tr class="memitem:a971cd7054c551c4460d5220f6ec5cf01"><td class="memTemplItemLeft" align="right" valign="top">bool&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01">attribute</a> (const String &amp;name, T &amp;value) const </td></tr>
+<tr class="memdesc:a971cd7054c551c4460d5220f6ec5cf01"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read user data from an XML attribute. <a href="#a971cd7054c551c4460d5220f6ec5cf01"></a><br/></td></tr>
+<tr class="memitem:a647b468b7c6c95b25f2e43627184177f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a647b468b7c6c95b25f2e43627184177f"></a>
+const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f">get</a> () const </td></tr>
+<tr class="memdesc:a647b468b7c6c95b25f2e43627184177f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return a pointer to the underlying Xml element, may be nullptr. <br/></td></tr>
+<tr class="memitem:a954950849b52557369932ab2a8b4ad72"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a954950849b52557369932ab2a8b4ad72">operator int ConversionToBool::*</a> () const </td></tr>
+<tr class="memdesc:a954950849b52557369932ab2a8b4ad72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test whether the underlying XML element exists. <a href="#a954950849b52557369932ab2a8b4ad72"></a><br/></td></tr>
+<tr class="memitem:a33b5dd504d3165aa3f923f6b33e9991a"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a">errorsOccured</a> () const </td></tr>
+<tr class="memdesc:a33b5dd504d3165aa3f923f6b33e9991a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Notifies errors while mapping the XML to user data. <a href="#a33b5dd504d3165aa3f923f6b33e9991a"></a><br/></td></tr>
+<tr class="memitem:a84bb497d3b3fc753d054e52c4823c05e"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a84bb497d3b3fc753d054e52c4823c05e"><td class="memTemplItemLeft" align="right" valign="top">std::vector&lt; String &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e">getErrorsAs</a> () const </td></tr>
+<tr class="memdesc:a84bb497d3b3fc753d054e52c4823c05e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a list of XML element and attribute names which failed to convert to user data. <a href="#a84bb497d3b3fc753d054e52c4823c05e"></a><br/></td></tr>
+</table>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Proxy class to conveniently convert XML structure to user data. </p>
+</div><hr/><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a5b48c9848e6c631a04cec2477ff85c0f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f">zen::XmlIn::XmlIn</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;&#160;</td>
+ <td class="paramname"><em>doc</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Construct an input proxy for an XML document. </p>
+<div class="fragment"><pre class="fragment"> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+ ... <span class="comment">//load document</span>
+ <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> in(doc);
+ in[<span class="stringliteral">&quot;elem1&quot;</span>](value1); <span class="comment">//</span>
+ in[<span class="stringliteral">&quot;elem2&quot;</span>](value2); <span class="comment">//read data from XML elements into variables &quot;value1&quot;, &quot;value2&quot;, &quot;value3&quot;</span>
+ in[<span class="stringliteral">&quot;elem3&quot;</span>](value3); <span class="comment">//</span>
+</pre></div>
+</div>
+</div>
+<a class="anchor" id="ae072660cde71fd4695c04d074098b430"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f">zen::XmlIn::XmlIn</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> *&#160;</td>
+ <td class="paramname"><em>element</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Construct an input proxy for a single XML element, may be nullptr. </p>
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn(const XmlDoc&amp; doc)</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a33de75412df69cb25e0fd8b3bc70c9f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f">zen::XmlIn::XmlIn</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;&#160;</td>
+ <td class="paramname"><em>element</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Construct an input proxy for a single XML element. </p>
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn(const XmlDoc&amp; doc)</a> </dd></dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a971cd7054c551c4460d5220f6ec5cf01"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String , class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01">zen::XmlIn::attribute</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Read user data from an XML attribute. </p>
+<p>This conversion requires a specialization of <a class="el" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">zen::readText()</a> for type T.</p>
+<div class="fragment"><pre class="fragment"> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+ ... <span class="comment">//load document</span>
+ <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> in(doc);
+ in[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr1&quot;</span>, value1); <span class="comment">//</span>
+ in[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr2&quot;</span>, value2); <span class="comment">//read data from XML attributes into variables &quot;value1&quot;, &quot;value2&quot;, &quot;value3&quot;</span>
+ in[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr3&quot;</span>, value3); <span class="comment">//</span>
+</pre></div><dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ <tr><td class="paramname">T</td><td>String-convertible user data type: e.g. any string-like type, all built-in arithmetic numbers </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>"true" if the attribute was found and the conversion to the output value was successful. </dd></dl>
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887" title="Retrieve an attribute by name.">XmlElement::getAttribute()</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a33b5dd504d3165aa3f923f6b33e9991a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a">zen::XmlIn::errorsOccured</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Notifies errors while mapping the XML to user data. </p>
+<p>Error logging is shared by each hiearchy of <a class="el" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">XmlIn</a> proxy instances that are created from each other. Consequently it doesn't matter which instance you query for errors: </p>
+<div class="fragment"><pre class="fragment"> <a class="code" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn</a> in(doc);
+ <a class="code" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn</a> inItem = in[<span class="stringliteral">&quot;item1&quot;</span>];
+
+ <span class="keywordtype">int</span> value = 0;
+ inItem(value); <span class="comment">//let&#39;s assume this conversion failed</span>
+
+ assert(in.errorsOccured() == inItem.errorsOccured());
+ assert(in.getErrorsAs&lt;std::string&gt;() == inItem.getErrorsAs&lt;std::string&gt;());
+</pre></div><p>Note that error logging is <b>NOT</b> global, but owned by all instances of a hierarchy of <a class="el" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">XmlIn</a> proxies. Therefore it's safe to use unrelated <a class="el" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">XmlIn</a> proxies in multiple threads. <br/>
+<br/>
+ However be aware that the chain of connected proxy instances will be broken once you call <a class="el" href="classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f" title="Return a pointer to the underlying Xml element, may be nullptr.">XmlIn::get()</a> to retrieve the underlying pointer. Errors that occur when working with this pointer are not logged by the original set of related instances. </p>
+
+</div>
+</div>
+<a class="anchor" id="a84bb497d3b3fc753d054e52c4823c05e"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">std::vector&lt;String&gt; <a class="el" href="classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e">zen::XmlIn::getErrorsAs</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Get a list of XML element and attribute names which failed to convert to user data. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string class: e.g. std::string, std::wstring, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>A list of XML element and attribute names, empty list if no errors occured. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a60cf2678c989621545d27745dcafa4a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4">zen::XmlIn::next</a> </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Refer to next sibling element with the same name. </p>
+<p><b>Example:</b> Loop over all XML child elements named "Item" </p>
+<div class="fragment"><pre class="fragment"> &lt;?xml version="1.0" encoding="UTF-8"?&gt;
+ &lt;Root&gt;
+ &lt;Item&gt;1&lt;/Item&gt;
+ &lt;Item&gt;3&lt;/Item&gt;
+ &lt;Item&gt;5&lt;/Item&gt;
+ &lt;/Root&gt;</pre></div><div class="fragment"><pre class="fragment"> <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> in(doc);
+ ...
+ <span class="keywordflow">for</span> (<a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> child = in[<span class="stringliteral">&quot;Item&quot;</span>]; child; child.<a class="code" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4" title="Refer to next sibling element with the same name.">next</a>())
+ {
+ ...
+ }
+</pre></div>
+</div>
+</div>
+<a class="anchor" id="a954950849b52557369932ab2a8b4ad72"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zen::XmlIn::operator int ConversionToBool::* </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Test whether the underlying XML element exists. </p>
+<div class="fragment"><pre class="fragment"> <a class="code" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn</a> in(doc);
+ <a class="code" href="classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f" title="Construct an input proxy for an XML document.">XmlIn</a> child = in[<span class="stringliteral">&quot;elem1&quot;</span>];
+ <span class="keywordflow">if</span> (child)
+ ...
+</pre></div><p> Use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20) </p>
+
+</div>
+</div>
+<a class="anchor" id="a98cc59f687c89549381e76105f8fb506"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool zen::XmlIn::operator() </td>
+ <td>(</td>
+ <td class="paramtype">T &amp;&#160;</td>
+ <td class="paramname"><em>value</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Read user data from the underlying XML element. </p>
+<p>This conversion requires a specialization of <a class="el" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">zen::readText()</a> or <a class="el" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">zen::readStruc()</a> for type T. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">T</td><td>User type that receives the data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>"true" if data was read successfully </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a9b38167835a28eac9a2297f35f51e53d"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_in.html">XmlIn</a> zen::XmlIn::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Retrieve a handle to an XML child element for reading. </p>
+<p>It is <b>not</b> an error if the child element does not exist, but only later if a conversion to user data is attempted. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">name</td><td>The name of the child element </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_out-members.html b/zenxml/doc/classzen_1_1_xml_out-members.html
new file mode 100644
index 00000000..368b094f
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_out-members.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Member List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_out.html">XmlOut</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlOut Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a>, including all inherited members.<table>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805">attribute</a>(const String &amp;name, const T &amp;value)</td><td><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb">operator()</a>(const T &amp;value)</td><td><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831">operator[]</a>(const String &amp;name) const </td><td><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2">ref</a>()</td><td><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc">XmlOut</a>(XmlDoc &amp;doc)</td><td><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0">XmlOut</a>(XmlElement &amp;element)</td><td><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></td><td></td></tr>
+</table></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/classzen_1_1_xml_out.html b/zenxml/doc/classzen_1_1_xml_out.html
new file mode 100644
index 00000000..e7fea1d5
--- /dev/null
+++ b/zenxml/doc/classzen_1_1_xml_out.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen::XmlOut Class Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="classzen_1_1_xml_out.html">XmlOut</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zen::XmlOut Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Proxy class to conveniently convert user data into XML structure.
+ <a href="classzen_1_1_xml_out.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="bind_8h_source.html">bind.h</a>&gt;</code></p>
+
+<p><a href="classzen_1_1_xml_out-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ad8b1ccb8f3d4e7b0ab2598597ea50bcc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc">XmlOut</a> (<a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;doc)</td></tr>
+<tr class="memdesc:ad8b1ccb8f3d4e7b0ab2598597ea50bcc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Construct an output proxy for an XML document. <a href="#ad8b1ccb8f3d4e7b0ab2598597ea50bcc"></a><br/></td></tr>
+<tr class="memitem:aa80be3a56f70a58d2730a763166088c0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0">XmlOut</a> (<a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;element)</td></tr>
+<tr class="memdesc:aa80be3a56f70a58d2730a763166088c0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Construct an output proxy for a single XML element. <a href="#aa80be3a56f70a58d2730a763166088c0"></a><br/></td></tr>
+<tr class="memitem:a00f883d3f9d60535b06b5ae609dc8831"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a00f883d3f9d60535b06b5ae609dc8831"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classzen_1_1_xml_out.html">XmlOut</a>&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831">operator[]</a> (const String &amp;name) const </td></tr>
+<tr class="memdesc:a00f883d3f9d60535b06b5ae609dc8831"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve a handle to an XML child element for writing. <a href="#a00f883d3f9d60535b06b5ae609dc8831"></a><br/></td></tr>
+<tr class="memitem:a09ca9144515e3c109b36062b0475c8eb"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:a09ca9144515e3c109b36062b0475c8eb"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb">operator()</a> (const T &amp;value)</td></tr>
+<tr class="memdesc:a09ca9144515e3c109b36062b0475c8eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write user data to the underlying XML element. <a href="#a09ca9144515e3c109b36062b0475c8eb"></a><br/></td></tr>
+<tr class="memitem:acaf9b71fe1d907dd63dd4b91e2e03805"><td class="memTemplParams" colspan="2">template&lt;class String , class T &gt; </td></tr>
+<tr class="memitem:acaf9b71fe1d907dd63dd4b91e2e03805"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805">attribute</a> (const String &amp;name, const T &amp;value)</td></tr>
+<tr class="memdesc:acaf9b71fe1d907dd63dd4b91e2e03805"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write user data to an XML attribute. <a href="#acaf9b71fe1d907dd63dd4b91e2e03805"></a><br/></td></tr>
+<tr class="memitem:aec117344e8a534382e8d5e76711f97b2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aec117344e8a534382e8d5e76711f97b2"></a>
+<a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2">ref</a> ()</td></tr>
+<tr class="memdesc:aec117344e8a534382e8d5e76711f97b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return a reference to the underlying Xml element. <br/></td></tr>
+</table>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Proxy class to conveniently convert user data into XML structure. </p>
+</div><hr/><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ad8b1ccb8f3d4e7b0ab2598597ea50bcc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc">zen::XmlOut::XmlOut</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;&#160;</td>
+ <td class="paramname"><em>doc</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Construct an output proxy for an XML document. </p>
+<div class="fragment"><pre class="fragment"> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+
+ <a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+ out[<span class="stringliteral">&quot;elem1&quot;</span>]( 1); <span class="comment">//</span>
+ out[<span class="stringliteral">&quot;elem2&quot;</span>]( 2); <span class="comment">//write data into XML elements</span>
+ out[<span class="stringliteral">&quot;elem3&quot;</span>](-3); <span class="comment">//</span>
+
+ <a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d" title="Save XML document to a file.">save</a>(doc, <span class="stringliteral">&quot;out.xml&quot;</span>); <span class="comment">//throw XmlFileError</span>
+</pre></div><p> Output: </p>
+<div class="fragment"><pre class="fragment"> &lt;?xml version="1.0" encoding="UTF-8"?&gt;
+ &lt;Root&gt;
+ &lt;elem1&gt;1&lt;/elem1&gt;
+ &lt;elem2&gt;2&lt;/elem2&gt;
+ &lt;elem3&gt;-3&lt;/elem3&gt;
+ &lt;/Root&gt;</pre></div>
+</div>
+</div>
+<a class="anchor" id="aa80be3a56f70a58d2730a763166088c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc">zen::XmlOut::XmlOut</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;&#160;</td>
+ <td class="paramname"><em>element</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Construct an output proxy for a single XML element. </p>
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc" title="Construct an output proxy for an XML document.">XmlOut(XmlDoc&amp; doc)</a> </dd></dl>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="acaf9b71fe1d907dd63dd4b91e2e03805"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String , class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805">zen::XmlOut::attribute</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Write user data to an XML attribute. </p>
+<p>This conversion requires a specialization of <a class="el" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">zen::writeText()</a> for type T. </p>
+<div class="fragment"><pre class="fragment"> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+
+ <a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+ out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr1&quot;</span>, 1); <span class="comment">//</span>
+ out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr2&quot;</span>, 2); <span class="comment">//write data into XML attributes</span>
+ out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr3&quot;</span>, -3); <span class="comment">//</span>
+
+ <a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d" title="Save XML document to a file.">save</a>(doc, <span class="stringliteral">&quot;out.xml&quot;</span>); <span class="comment">//throw XmlFileError</span>
+</pre></div><p> Output: </p>
+<div class="fragment"><pre class="fragment"> &lt;?xml version="1.0" encoding="UTF-8"?&gt;
+ &lt;Root&gt;
+ &lt;elem attr1="1" attr2="2" attr3="-3"/&gt;
+ &lt;/Root&gt;</pre></div><dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ <tr><td class="paramname">T</td><td>String-convertible user data type: e.g. any string-like type, all built-in arithmetic numbers </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section see"><dt>See also:</dt><dd><a class="el" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421" title="Create or update an XML attribute.">XmlElement::setAttribute()</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a09ca9144515e3c109b36062b0475c8eb"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void zen::XmlOut::operator() </td>
+ <td>(</td>
+ <td class="paramtype">const T &amp;&#160;</td>
+ <td class="paramname"><em>value</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Write user data to the underlying XML element. </p>
+<p>This conversion requires a specialization of <a class="el" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">zen::writeText()</a> or <a class="el" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">zen::writeStruc()</a> for type T. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">T</td><td>User type that is converted into an XML element value. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a00f883d3f9d60535b06b5ae609dc8831"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classzen_1_1_xml_out.html">XmlOut</a> zen::XmlOut::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>name</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Retrieve a handle to an XML child element for writing. </p>
+<p>The child element will be created if it is not yet existing. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">name</td><td>The name of the child element </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/closed.png b/zenxml/doc/closed.png
new file mode 100644
index 00000000..b7d4bd9f
--- /dev/null
+++ b/zenxml/doc/closed.png
Binary files differ
diff --git a/zenxml/doc/cvrt__struc_8h_source.html b/zenxml/doc/cvrt__struc_8h_source.html
new file mode 100644
index 00000000..6bd4e7af
--- /dev/null
+++ b/zenxml/doc/cvrt__struc_8h_source.html
@@ -0,0 +1,305 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: cvrt_struc.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">cvrt_struc.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_CONVERT_STRUC_HEADER_018727409908342709743</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_CONVERT_STRUC_HEADER_018727409908342709743</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;dom.h&quot;</span>
+<a name="l00011"></a>00011
+<a name="l00012"></a>00012 <span class="keyword">namespace </span>zen
+<a name="l00013"></a>00013 {
+<a name="l00020"></a>00020
+<a name="l00021"></a>00021
+<a name="l00026"></a>00026 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(<span class="keyword">const</span> XmlElement&amp; input, T&amp; value);
+<a name="l00028"></a>00028
+<a name="l00032"></a>00032 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(<span class="keyword">const</span> T&amp; value, XmlElement&amp; output);
+<a name="l00033"></a>00033
+<a name="l00034"></a>00034
+<a name="l00035"></a>00035
+<a name="l00036"></a>00036
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038
+<a name="l00039"></a>00039
+<a name="l00040"></a>00040
+<a name="l00041"></a>00041
+<a name="l00042"></a>00042
+<a name="l00043"></a>00043
+<a name="l00044"></a>00044
+<a name="l00045"></a>00045
+<a name="l00046"></a>00046
+<a name="l00047"></a>00047
+<a name="l00048"></a>00048
+<a name="l00049"></a>00049
+<a name="l00050"></a>00050 <span class="comment">//------------------------------ implementation -------------------------------------</span>
+<a name="l00051"></a>00051 <span class="keyword">namespace </span>impl_2384343
+<a name="l00052"></a>00052 {
+<a name="l00053"></a>00053 ZEN_INIT_DETECT_MEMBER_TYPE(value_type);
+<a name="l00054"></a>00054 ZEN_INIT_DETECT_MEMBER_TYPE(iterator);
+<a name="l00055"></a>00055 ZEN_INIT_DETECT_MEMBER_TYPE(const_iterator);
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057 ZEN_INIT_DETECT_MEMBER(begin) <span class="comment">//</span>
+<a name="l00058"></a>00058 ZEN_INIT_DETECT_MEMBER(end) <span class="comment">//we don&#39;t know the exact declaration of the member attribute: may be in a base class!</span>
+<a name="l00059"></a>00059 ZEN_INIT_DETECT_MEMBER(insert) <span class="comment">//</span>
+<a name="l00060"></a>00060 }
+<a name="l00061"></a>00061
+<a name="l00062"></a>00062 template &lt;typename T&gt;
+<a name="l00063"></a>00063 struct IsStlContainer :
+<a name="l00064"></a>00064 StaticBool&lt;
+<a name="l00065"></a>00065 impl_2384343::HasMemberType_value_type &lt;T&gt;::value&amp;&amp;
+<a name="l00066"></a>00066 impl_2384343::HasMemberType_iterator &lt;T&gt;::value&amp;&amp;
+<a name="l00067"></a>00067 impl_2384343::HasMemberType_const_iterator&lt;T&gt;::value&amp;&amp;
+<a name="l00068"></a>00068 impl_2384343::HasMember_begin &lt;T&gt;::value&amp;&amp;
+<a name="l00069"></a>00069 impl_2384343::HasMember_end &lt;T&gt;::value&amp;&amp;
+<a name="l00070"></a>00070 impl_2384343::HasMember_insert &lt;T&gt;::value&gt; {};
+<a name="l00071"></a>00071
+<a name="l00072"></a>00072
+<a name="l00073"></a>00073 <span class="keyword">namespace </span>impl_2384343
+<a name="l00074"></a>00074 {
+<a name="l00075"></a>00075 ZEN_INIT_DETECT_MEMBER_TYPE(first_type);
+<a name="l00076"></a>00076 ZEN_INIT_DETECT_MEMBER_TYPE(second_type);
+<a name="l00077"></a>00077
+<a name="l00078"></a>00078 ZEN_INIT_DETECT_MEMBER(first) <span class="comment">//we don&#39;t know the exact declaration of the member attribute: may be in a base class!</span>
+<a name="l00079"></a>00079 ZEN_INIT_DETECT_MEMBER(second) <span class="comment">//</span>
+<a name="l00080"></a>00080 }
+<a name="l00081"></a>00081
+<a name="l00082"></a>00082 template &lt;typename T&gt;
+<a name="l00083"></a>00083 struct IsStlPair :
+<a name="l00084"></a>00084 StaticBool&lt;
+<a name="l00085"></a>00085 impl_2384343::HasMemberType_first_type &lt;T&gt;::value&amp;&amp;
+<a name="l00086"></a>00086 impl_2384343::HasMemberType_second_type&lt;T&gt;::value&amp;&amp;
+<a name="l00087"></a>00087 impl_2384343::HasMember_first &lt;T&gt;::value&amp;&amp;
+<a name="l00088"></a>00088 impl_2384343::HasMember_second &lt;T&gt;::value&gt; {};
+<a name="l00089"></a>00089
+<a name="l00090"></a>00090 <span class="comment">//######################################################################################</span>
+<a name="l00091"></a>00091
+<a name="l00092"></a>00092 <span class="comment">//Conversion from arbitrary types to an XML element</span>
+<a name="l00093"></a>00093 <span class="keyword">enum</span> ValueType
+<a name="l00094"></a>00094 {
+<a name="l00095"></a>00095 VALUE_TYPE_STL_CONTAINER,
+<a name="l00096"></a>00096 VALUE_TYPE_STL_PAIR,
+<a name="l00097"></a>00097 VALUE_TYPE_OTHER,
+<a name="l00098"></a>00098 };
+<a name="l00099"></a>00099
+<a name="l00100"></a>00100 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00101"></a>00101 <span class="keyword">struct </span>GetValueType : StaticEnum&lt;ValueType,
+<a name="l00102"></a>00102 GetTextType&lt;T&gt;::value != TEXT_TYPE_OTHER ? VALUE_TYPE_OTHER : <span class="comment">//some string classes are also STL containers, so check this first</span>
+<a name="l00103"></a>00103 IsStlContainer&lt;T&gt;::value ? VALUE_TYPE_STL_CONTAINER :
+<a name="l00104"></a>00104 IsStlPair&lt;T&gt;::value ? VALUE_TYPE_STL_PAIR :
+<a name="l00105"></a>00105 VALUE_TYPE_OTHER&gt; {};
+<a name="l00106"></a>00106
+<a name="l00107"></a>00107
+<a name="l00108"></a>00108 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, ValueType type&gt;
+<a name="l00109"></a>00109 <span class="keyword">struct </span>ConvertElement;
+<a name="l00110"></a>00110 <span class="comment">/* -&gt; expected interface</span>
+<a name="l00111"></a>00111 <span class="comment">{</span>
+<a name="l00112"></a>00112 <span class="comment"> void writeStruc(const T&amp; value, XmlElement&amp; output) const;</span>
+<a name="l00113"></a>00113 <span class="comment"> bool readStruc(const XmlElement&amp; input, T&amp; value) const;</span>
+<a name="l00114"></a>00114 <span class="comment">};</span>
+<a name="l00115"></a>00115 <span class="comment">*/</span>
+<a name="l00116"></a>00116
+<a name="l00117"></a>00117
+<a name="l00118"></a>00118 <span class="comment">//partial specialization: handle conversion for all STL-container types!</span>
+<a name="l00119"></a>00119 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00120"></a>00120 <span class="keyword">struct </span>ConvertElement&lt;T, VALUE_TYPE_STL_CONTAINER&gt;
+<a name="l00121"></a>00121 {
+<a name="l00122"></a>00122 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(<span class="keyword">const</span> T&amp; value, XmlElement&amp; output)<span class="keyword"> const</span>
+<a name="l00123"></a>00123 <span class="keyword"> </span>{
+<a name="l00124"></a>00124 std::for_each(value.begin(), value.end(),
+<a name="l00125"></a>00125 [&amp;](<span class="keyword">const</span> <span class="keyword">typename</span> T::value_type &amp; childVal)
+<a name="l00126"></a>00126 {
+<a name="l00127"></a>00127 XmlElement&amp; newChild = output.addChild(<span class="stringliteral">&quot;Item&quot;</span>);
+<a name="l00128"></a>00128 <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">zen::writeStruc</a>(childVal, newChild);
+<a name="l00129"></a>00129 });
+<a name="l00130"></a>00130 }
+<a name="l00131"></a>00131 <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(<span class="keyword">const</span> XmlElement&amp; input, T&amp; value)<span class="keyword"> const</span>
+<a name="l00132"></a>00132 <span class="keyword"> </span>{
+<a name="l00133"></a>00133 <span class="keywordtype">bool</span> success = <span class="keyword">true</span>;
+<a name="l00134"></a>00134 value.clear();
+<a name="l00135"></a>00135
+<a name="l00136"></a>00136 <span class="keyword">auto</span> iterPair = input.getChildren(<span class="stringliteral">&quot;Item&quot;</span>);
+<a name="l00137"></a>00137 <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = iterPair.first; iter != iterPair.second; ++iter)
+<a name="l00138"></a>00138 {
+<a name="l00139"></a>00139 <span class="keyword">typename</span> T::value_type childVal; <span class="comment">//MSVC 2010 bug: cannot put this into a lambda body</span>
+<a name="l00140"></a>00140 <span class="keywordflow">if</span> (<a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">zen::readStruc</a>(*iter, childVal))
+<a name="l00141"></a>00141 value.insert(value.end(), childVal);
+<a name="l00142"></a>00142 <span class="keywordflow">else</span>
+<a name="l00143"></a>00143 success = <span class="keyword">false</span>;
+<a name="l00144"></a>00144 }
+<a name="l00145"></a>00145 <span class="keywordflow">return</span> success;
+<a name="l00146"></a>00146 }
+<a name="l00147"></a>00147 };
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149
+<a name="l00150"></a>00150 <span class="comment">//partial specialization: handle conversion for std::pair</span>
+<a name="l00151"></a>00151 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00152"></a>00152 <span class="keyword">struct </span>ConvertElement&lt;T, VALUE_TYPE_STL_PAIR&gt;
+<a name="l00153"></a>00153 {
+<a name="l00154"></a>00154 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(<span class="keyword">const</span> T&amp; value, XmlElement&amp; output)<span class="keyword"> const</span>
+<a name="l00155"></a>00155 <span class="keyword"> </span>{
+<a name="l00156"></a>00156 XmlElement&amp; child1 = output.addChild(<span class="stringliteral">&quot;one&quot;</span>); <span class="comment">//don&#39;t use &quot;1st/2nd&quot;, this will confuse a few pedantic XML parsers</span>
+<a name="l00157"></a>00157 <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">zen::writeStruc</a>(value.first, child1);
+<a name="l00158"></a>00158
+<a name="l00159"></a>00159 XmlElement&amp; child2 = output.addChild(<span class="stringliteral">&quot;two&quot;</span>);
+<a name="l00160"></a>00160 <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">zen::writeStruc</a>(value.second, child2);
+<a name="l00161"></a>00161 }
+<a name="l00162"></a>00162 <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(<span class="keyword">const</span> XmlElement&amp; input, T&amp; value)<span class="keyword"> const</span>
+<a name="l00163"></a>00163 <span class="keyword"> </span>{
+<a name="l00164"></a>00164 <span class="keywordtype">bool</span> success = <span class="keyword">true</span>;
+<a name="l00165"></a>00165 <span class="keyword">const</span> XmlElement* child1 = input.getChild(<span class="stringliteral">&quot;one&quot;</span>);
+<a name="l00166"></a>00166 <span class="keywordflow">if</span> (!child1 || !<a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">zen::readStruc</a>(*child1, value.first))
+<a name="l00167"></a>00167 success = <span class="keyword">false</span>;
+<a name="l00168"></a>00168
+<a name="l00169"></a>00169 <span class="keyword">const</span> XmlElement* child2 = input.getChild(<span class="stringliteral">&quot;two&quot;</span>);
+<a name="l00170"></a>00170 <span class="keywordflow">if</span> (!child2 || !<a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">zen::readStruc</a>(*child2, value.second))
+<a name="l00171"></a>00171 success = <span class="keyword">false</span>;
+<a name="l00172"></a>00172
+<a name="l00173"></a>00173 <span class="keywordflow">return</span> success;
+<a name="l00174"></a>00174 }
+<a name="l00175"></a>00175 };
+<a name="l00176"></a>00176
+<a name="l00177"></a>00177
+<a name="l00178"></a>00178 <span class="comment">//partial specialization: not a pure structured type, try text conversion (thereby respect user specializations of writeText()/readText())</span>
+<a name="l00179"></a>00179 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00180"></a>00180 <span class="keyword">struct </span>ConvertElement&lt;T, VALUE_TYPE_OTHER&gt;
+<a name="l00181"></a>00181 {
+<a name="l00182"></a>00182 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(<span class="keyword">const</span> T&amp; value, XmlElement&amp; output)<span class="keyword"> const</span>
+<a name="l00183"></a>00183 <span class="keyword"> </span>{
+<a name="l00184"></a>00184 std::string tmp;
+<a name="l00185"></a>00185 <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(value, tmp);
+<a name="l00186"></a>00186 output.setValue(tmp);
+<a name="l00187"></a>00187 }
+<a name="l00188"></a>00188 <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(<span class="keyword">const</span> XmlElement&amp; input, T&amp; value)<span class="keyword"> const</span>
+<a name="l00189"></a>00189 <span class="keyword"> </span>{
+<a name="l00190"></a>00190 std::string rawStr;
+<a name="l00191"></a>00191 input.getValue(rawStr);
+<a name="l00192"></a>00192 <span class="keywordflow">return</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(rawStr, value);
+<a name="l00193"></a>00193 }
+<a name="l00194"></a>00194 };
+<a name="l00195"></a>00195
+<a name="l00196"></a>00196
+<a name="l00197"></a>00197 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span>
+<a name="l00198"></a><a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6">00198</a> <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(<span class="keyword">const</span> T&amp; value, <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; output)
+<a name="l00199"></a>00199 {
+<a name="l00200"></a>00200 ConvertElement&lt;T, GetValueType&lt;T&gt;::value&gt;().<a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(value, output);
+<a name="l00201"></a>00201 }
+<a name="l00202"></a>00202
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span>
+<a name="l00205"></a><a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1">00205</a> <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; input, T&amp; value)
+<a name="l00206"></a>00206 {
+<a name="l00207"></a>00207 <span class="keywordflow">return</span> ConvertElement&lt;T, GetValueType&lt;T&gt;::value&gt;().<a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(input, value);
+<a name="l00208"></a>00208 }
+<a name="l00209"></a>00209 }
+<a name="l00210"></a>00210
+<a name="l00211"></a>00211 <span class="preprocessor">#endif //ZEN_XML_CONVERT_STRUC_HEADER_018727409908342709743</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/cvrt__text_8h_source.html b/zenxml/doc/cvrt__text_8h_source.html
new file mode 100644
index 00000000..d10a3b8f
--- /dev/null
+++ b/zenxml/doc/cvrt__text_8h_source.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: cvrt_text.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">cvrt_text.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_CONVERT_TEXT_HEADER_018727339083427097434</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_CONVERT_TEXT_HEADER_018727339083427097434</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;zen/utf.h&gt;</span>
+<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;zen/string_tools.h&gt;</span>
+<a name="l00012"></a>00012
+<a name="l00013"></a>00013 <span class="keyword">namespace </span>zen
+<a name="l00014"></a>00014 {
+<a name="l00061"></a>00061
+<a name="l00062"></a>00062
+<a name="l00067"></a>00067 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(<span class="keyword">const</span> std::string&amp; input, T&amp; value);
+<a name="l00069"></a>00069
+<a name="l00073"></a>00073 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(<span class="keyword">const</span> T&amp; value, std::string&amp; output);
+<a name="l00074"></a>00074
+<a name="l00075"></a>00075
+<a name="l00076"></a>00076 <span class="comment">/* Different classes of data types:</span>
+<a name="l00077"></a>00077 <span class="comment"></span>
+<a name="l00078"></a>00078 <span class="comment">-----------------------------</span>
+<a name="l00079"></a>00079 <span class="comment">| structured | readStruc/writeStruc - e.g. string-convertible types, STL containers, std::pair, structured user types</span>
+<a name="l00080"></a>00080 <span class="comment">| ------------------------- |</span>
+<a name="l00081"></a>00081 <span class="comment">| | to-string-convertible | | readText/writeText - e.g. string-like types, all built-in arithmetic numbers, bool</span>
+<a name="l00082"></a>00082 <span class="comment">| | --------------- | |</span>
+<a name="l00083"></a>00083 <span class="comment">| | | string-like | | | utfCvrtTo - e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ...</span>
+<a name="l00084"></a>00084 <span class="comment">| | --------------- | |</span>
+<a name="l00085"></a>00085 <span class="comment">| ------------------------- |</span>
+<a name="l00086"></a>00086 <span class="comment">-----------------------------</span>
+<a name="l00087"></a>00087 <span class="comment">*/</span>
+<a name="l00088"></a>00088
+<a name="l00089"></a>00089
+<a name="l00090"></a>00090
+<a name="l00091"></a>00091
+<a name="l00092"></a>00092
+<a name="l00093"></a>00093
+<a name="l00094"></a>00094
+<a name="l00095"></a>00095
+<a name="l00096"></a>00096
+<a name="l00097"></a>00097
+<a name="l00098"></a>00098
+<a name="l00099"></a>00099
+<a name="l00100"></a>00100
+<a name="l00101"></a>00101
+<a name="l00102"></a>00102
+<a name="l00103"></a>00103 <span class="comment">//------------------------------ implementation -------------------------------------</span>
+<a name="l00104"></a>00104
+<a name="l00105"></a>00105 <span class="comment">//Conversion from arbitrary types to text (for use with XML elements and attributes)</span>
+<a name="l00106"></a>00106 <span class="keyword">enum</span> TextType
+<a name="l00107"></a>00107 {
+<a name="l00108"></a>00108 TEXT_TYPE_BOOL,
+<a name="l00109"></a>00109 TEXT_TYPE_NUMBER,
+<a name="l00110"></a>00110 TEXT_TYPE_STRING,
+<a name="l00111"></a>00111 TEXT_TYPE_OTHER,
+<a name="l00112"></a>00112 };
+<a name="l00113"></a>00113
+<a name="l00114"></a>00114 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00115"></a>00115 <span class="keyword">struct </span>GetTextType : StaticEnum&lt;TextType,
+<a name="l00116"></a>00116 IsSameType&lt;T, bool&gt;::value ? TEXT_TYPE_BOOL :
+<a name="l00117"></a>00117 IsStringLike&lt;T&gt;::value ? TEXT_TYPE_STRING : <span class="comment">//string before number to correctly handle char/wchar_t -&gt; this was an issue with Loki only!</span>
+<a name="l00118"></a>00118 IsArithmetic&lt;T&gt;::value ? TEXT_TYPE_NUMBER : <span class="comment">//</span>
+<a name="l00119"></a>00119 TEXT_TYPE_OTHER&gt; {};
+<a name="l00120"></a>00120
+<a name="l00121"></a>00121 <span class="comment">//######################################################################################</span>
+<a name="l00122"></a>00122
+<a name="l00123"></a>00123 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, TextType type&gt;
+<a name="l00124"></a>00124 <span class="keyword">struct </span>ConvertText;
+<a name="l00125"></a>00125 <span class="comment">/* -&gt; expected interface</span>
+<a name="l00126"></a>00126 <span class="comment">{</span>
+<a name="l00127"></a>00127 <span class="comment"> void writeText(const T&amp; value, std::string&amp; output) const;</span>
+<a name="l00128"></a>00128 <span class="comment"> bool readText(const std::string&amp; input, T&amp; value) const;</span>
+<a name="l00129"></a>00129 <span class="comment">};</span>
+<a name="l00130"></a>00130 <span class="comment">*/</span>
+<a name="l00131"></a>00131
+<a name="l00132"></a>00132 <span class="comment">//partial specialization: type bool</span>
+<a name="l00133"></a>00133 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00134"></a>00134 <span class="keyword">struct </span>ConvertText&lt;T, TEXT_TYPE_BOOL&gt;
+<a name="l00135"></a>00135 {
+<a name="l00136"></a>00136 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(<span class="keywordtype">bool</span> value, std::string&amp; output)<span class="keyword"> const</span>
+<a name="l00137"></a>00137 <span class="keyword"> </span>{
+<a name="l00138"></a>00138 output = value ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>;
+<a name="l00139"></a>00139 }
+<a name="l00140"></a>00140 <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(<span class="keyword">const</span> std::string&amp; input, <span class="keywordtype">bool</span>&amp; value)<span class="keyword"> const</span>
+<a name="l00141"></a>00141 <span class="keyword"> </span>{
+<a name="l00142"></a>00142 std::string tmp = input;
+<a name="l00143"></a>00143 zen::trim(tmp);
+<a name="l00144"></a>00144 <span class="keywordflow">if</span> (tmp == <span class="stringliteral">&quot;true&quot;</span>)
+<a name="l00145"></a>00145 value = <span class="keyword">true</span>;
+<a name="l00146"></a>00146 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tmp == <span class="stringliteral">&quot;false&quot;</span>)
+<a name="l00147"></a>00147 value = <span class="keyword">false</span>;
+<a name="l00148"></a>00148 <span class="keywordflow">else</span>
+<a name="l00149"></a>00149 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00150"></a>00150 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00151"></a>00151 }
+<a name="l00152"></a>00152 };
+<a name="l00153"></a>00153
+<a name="l00154"></a>00154 <span class="comment">//partial specialization: handle conversion for all built-in arithmetic types!</span>
+<a name="l00155"></a>00155 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00156"></a>00156 <span class="keyword">struct </span>ConvertText&lt;T, TEXT_TYPE_NUMBER&gt;
+<a name="l00157"></a>00157 {
+<a name="l00158"></a>00158 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(<span class="keyword">const</span> T&amp; value, std::string&amp; output)<span class="keyword"> const</span>
+<a name="l00159"></a>00159 <span class="keyword"> </span>{
+<a name="l00160"></a>00160 output = numberTo&lt;std::string&gt;(value);
+<a name="l00161"></a>00161 }
+<a name="l00162"></a>00162 <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(<span class="keyword">const</span> std::string&amp; input, T&amp; value)<span class="keyword"> const</span>
+<a name="l00163"></a>00163 <span class="keyword"> </span>{
+<a name="l00164"></a>00164 value = stringTo&lt;T&gt;(input);
+<a name="l00165"></a>00165 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00166"></a>00166 }
+<a name="l00167"></a>00167 };
+<a name="l00168"></a>00168
+<a name="l00169"></a>00169 <span class="comment">//partial specialization: handle conversion for all string-like types!</span>
+<a name="l00170"></a>00170 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00171"></a>00171 <span class="keyword">struct </span>ConvertText&lt;T, TEXT_TYPE_STRING&gt;
+<a name="l00172"></a>00172 {
+<a name="l00173"></a>00173 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(<span class="keyword">const</span> T&amp; value, std::string&amp; output)<span class="keyword"> const</span>
+<a name="l00174"></a>00174 <span class="keyword"> </span>{
+<a name="l00175"></a>00175 output = utfCvrtTo&lt;std::string&gt;(value);
+<a name="l00176"></a>00176 }
+<a name="l00177"></a>00177 <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(<span class="keyword">const</span> std::string&amp; input, T&amp; value)<span class="keyword"> const</span>
+<a name="l00178"></a>00178 <span class="keyword"> </span>{
+<a name="l00179"></a>00179 value = utfCvrtTo&lt;T&gt;(input);
+<a name="l00180"></a>00180 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00181"></a>00181 }
+<a name="l00182"></a>00182 };
+<a name="l00183"></a>00183
+<a name="l00184"></a>00184
+<a name="l00185"></a>00185 <span class="comment">//partial specialization: unknown type</span>
+<a name="l00186"></a>00186 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00187"></a>00187 <span class="keyword">struct </span>ConvertText&lt;T, TEXT_TYPE_OTHER&gt;
+<a name="l00188"></a>00188 {
+<a name="l00189"></a>00189 <span class="comment">//###########################################################################################################################################</span>
+<a name="l00190"></a>00190 assert_static(<span class="keyword">sizeof</span>(T) == -1);
+<a name="l00191"></a>00191 <span class="comment">/*</span>
+<a name="l00192"></a>00192 <span class="comment"> ATTENTION: The data type T is yet unknown to the zen::Xml framework!</span>
+<a name="l00193"></a>00193 <span class="comment"></span>
+<a name="l00194"></a>00194 <span class="comment"> Please provide a specialization for T of the following two functions in order to handle conversions to XML elements and attributes</span>
+<a name="l00195"></a>00195 <span class="comment"></span>
+<a name="l00196"></a>00196 <span class="comment"> template &lt;&gt; void zen::writeText(const T&amp; value, std::string&amp; output)</span>
+<a name="l00197"></a>00197 <span class="comment"> template &lt;&gt; bool zen::readText(const std::string&amp; input, T&amp; value)</span>
+<a name="l00198"></a>00198 <span class="comment"></span>
+<a name="l00199"></a>00199 <span class="comment"> If T is structured and cannot be converted to a text representation specialize these two functions to allow at least for conversions to XML elements:</span>
+<a name="l00200"></a>00200 <span class="comment"></span>
+<a name="l00201"></a>00201 <span class="comment"> template &lt;&gt; void zen::writeStruc(const T&amp; value, XmlElement&amp; output)</span>
+<a name="l00202"></a>00202 <span class="comment"> template &lt;&gt; bool zen::readStruc(const XmlElement&amp; input, T&amp; value)</span>
+<a name="l00203"></a>00203 <span class="comment"> */</span>
+<a name="l00204"></a>00204 <span class="comment">//###########################################################################################################################################</span>
+<a name="l00205"></a>00205 };
+<a name="l00206"></a>00206
+<a name="l00207"></a>00207
+<a name="l00208"></a>00208 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span>
+<a name="l00209"></a><a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f">00209</a> <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(<span class="keyword">const</span> T&amp; value, std::string&amp; output)
+<a name="l00210"></a>00210 {
+<a name="l00211"></a>00211 ConvertText&lt;T, GetTextType&lt;T&gt;::value&gt;().<a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(value, output);
+<a name="l00212"></a>00212 }
+<a name="l00213"></a>00213
+<a name="l00214"></a>00214
+<a name="l00215"></a>00215 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span>
+<a name="l00216"></a><a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff">00216</a> <span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(<span class="keyword">const</span> std::string&amp; input, T&amp; value)
+<a name="l00217"></a>00217 {
+<a name="l00218"></a>00218 <span class="keywordflow">return</span> ConvertText&lt;T, GetTextType&lt;T&gt;::value&gt;().<a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(input, value);
+<a name="l00219"></a>00219 }
+<a name="l00220"></a>00220 }
+<a name="l00221"></a>00221
+<a name="l00222"></a>00222 <span class="preprocessor">#endif //ZEN_XML_CONVERT_TEXT_HEADER_018727339083427097434</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/dom_8h_source.html b/zenxml/doc/dom_8h_source.html
new file mode 100644
index 00000000..e81e00a9
--- /dev/null
+++ b/zenxml/doc/dom_8h_source.html
@@ -0,0 +1,346 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: dom.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dom.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_DOM_HEADER_82085720723894567204564256</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_DOM_HEADER_82085720723894567204564256</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;string&gt;</span>
+<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;vector&gt;</span>
+<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;memory&gt;</span>
+<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;map&gt;</span>
+<a name="l00014"></a>00014 <span class="preprocessor">#include &quot;cvrt_text.h&quot;</span> <span class="comment">//&quot;readText/writeText&quot;</span>
+<a name="l00015"></a>00015
+<a name="l00016"></a>00016 <span class="keyword">namespace </span>zen
+<a name="l00017"></a>00017 {
+<a name="l00018"></a>00018 <span class="keyword">class </span>XmlDoc;
+<a name="l00019"></a>00019
+<a name="l00021"></a><a class="code" href="classzen_1_1_xml_element.html">00021</a> <span class="keyword">class </span><a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>
+<a name="l00022"></a>00022 {
+<a name="l00023"></a>00023 <span class="keyword">struct </span>PrivateConstruction {};
+<a name="l00024"></a>00024 <span class="keyword">public</span>:
+<a name="l00025"></a>00025 <span class="comment">//Construct an empty XML element</span>
+<a name="l00026"></a>00026 <span class="comment">//This constructor should be private, however std::make_shared() requires public access</span>
+<a name="l00027"></a>00027 <span class="comment">//Therefore at least prevent users from calling it via private dummy type PrivateConstruction</span>
+<a name="l00028"></a>00028 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00029"></a>00029 <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>(<span class="keyword">const</span> String&amp; name, <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* parentElement, PrivateConstruction) : name_(utfCvrtTo&lt;std::string&gt;(name)), parent_(parentElement) {}
+<a name="l00030"></a>00030
+<a name="l00032"></a>00032
+<a name="l00036"></a>00036 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00037"></a><a class="code" href="classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50">00037</a> String <a class="code" href="classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50" title="Retrieve the name of this XML element.">getNameAs</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> utfCvrtTo&lt;String&gt;(name_); }
+<a name="l00038"></a>00038
+<a name="l00040"></a>00040
+<a name="l00044"></a>00044 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00045"></a><a class="code" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070">00045</a> <span class="keywordtype">bool</span> <a class="code" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070" title="Get the value of this element as a user type.">getValue</a>(T&amp; value)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(*<span class="keyword">this</span>, value); }
+<a name="l00046"></a>00046
+<a name="l00048"></a>00048
+<a name="l00051"></a>00051 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
+<a name="l00052"></a><a class="code" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01">00052</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01" title="Set the value of this element.">setValue</a>(<span class="keyword">const</span> T&amp; value) { <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(value, *<span class="keyword">this</span>); }
+<a name="l00053"></a>00053
+<a name="l00055"></a>00055
+<a name="l00062"></a>00062 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String, <span class="keyword">class</span> T&gt;
+<a name="l00063"></a><a class="code" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887">00063</a> <span class="keywordtype">bool</span> <a class="code" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887" title="Retrieve an attribute by name.">getAttribute</a>(<span class="keyword">const</span> String&amp; name, T&amp; value)<span class="keyword"> const</span>
+<a name="l00064"></a>00064 <span class="keyword"> </span>{
+<a name="l00065"></a>00065 <span class="keyword">auto</span> it = attributes.find(utfCvrtTo&lt;std::string&gt;(name));
+<a name="l00066"></a>00066 <span class="keywordflow">return</span> it == attributes.end() ? <span class="keyword">false</span> : <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(it-&gt;second, value);
+<a name="l00067"></a>00067 }
+<a name="l00068"></a>00068
+<a name="l00070"></a>00070
+<a name="l00076"></a>00076 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String, <span class="keyword">class</span> T&gt;
+<a name="l00077"></a><a class="code" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421">00077</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421" title="Create or update an XML attribute.">setAttribute</a>(<span class="keyword">const</span> String&amp; name, <span class="keyword">const</span> T&amp; value)
+<a name="l00078"></a>00078 {
+<a name="l00079"></a>00079 std::string attrValue;
+<a name="l00080"></a>00080 <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(value, attrValue);
+<a name="l00081"></a>00081 attributes[utfCvrtTo&lt;std::string&gt;(name)] = attrValue;
+<a name="l00082"></a>00082 }
+<a name="l00083"></a>00083
+<a name="l00085"></a>00085
+<a name="l00088"></a>00088 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00089"></a><a class="code" href="classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934">00089</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934" title="Remove the attribute with the given name.">removeAttribute</a>(<span class="keyword">const</span> String&amp; name) { attributes.erase(utfCvrtTo&lt;std::string&gt;(name)); }
+<a name="l00090"></a>00090
+<a name="l00092"></a>00092
+<a name="l00096"></a>00096 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00097"></a><a class="code" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9">00097</a> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; <a class="code" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9" title="Create a new child element and return a reference to it.">addChild</a>(<span class="keyword">const</span> String&amp; name)
+<a name="l00098"></a>00098 {
+<a name="l00099"></a>00099 std::string utf8Name = utfCvrtTo&lt;std::string&gt;(name);
+<a name="l00100"></a>00100 <span class="keyword">auto</span> newElement = std::make_shared&lt;XmlElement&gt;(utf8Name, <span class="keyword">this</span>, PrivateConstruction());
+<a name="l00101"></a>00101 childElements.push_back(newElement);
+<a name="l00102"></a>00102 childElementsSorted.insert(std::make_pair(utf8Name, newElement));
+<a name="l00103"></a>00103 <span class="keywordflow">return</span> *newElement;
+<a name="l00104"></a>00104 }
+<a name="l00105"></a>00105
+<a name="l00107"></a>00107
+<a name="l00112"></a>00112 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00113"></a><a class="code" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e">00113</a> <span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* <a class="code" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e" title="Retrieve a child element with the given name.">getChild</a>(<span class="keyword">const</span> String&amp; name)<span class="keyword"> const</span>
+<a name="l00114"></a>00114 <span class="keyword"> </span>{
+<a name="l00115"></a>00115 <span class="keyword">auto</span> it = childElementsSorted.find(utfCvrtTo&lt;std::string&gt;(name));
+<a name="l00116"></a>00116 <span class="keywordflow">return</span> it == childElementsSorted.end() ? <span class="keyword">nullptr</span> : &amp;*(it-&gt;second);
+<a name="l00117"></a>00117 }
+<a name="l00118"></a>00118
+<a name="l00120"></a>00120 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00121"></a><a class="code" href="classzen_1_1_xml_element.html#a5d672e8ccc7592442ab927bb267af658">00121</a> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* <a class="code" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e" title="Retrieve a child element with the given name.">getChild</a>(<span class="keyword">const</span> String&amp; name)
+<a name="l00122"></a>00122 {
+<a name="l00123"></a>00123 <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>*<span class="keyword">&gt;</span>(<span class="keyword">static_cast&lt;</span><span class="keyword">const </span><a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;<a class="code" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e" title="Retrieve a child element with the given name.">getChild</a>(name));
+<a name="l00124"></a>00124 }
+<a name="l00125"></a>00125
+<a name="l00126"></a>00126 <span class="keyword">template</span> &lt; <span class="keyword">class </span>IterTy, <span class="comment">//underlying iterator type</span>
+<a name="l00127"></a>00127 <span class="keyword">class </span>T, <span class="comment">//target object type</span>
+<a name="l00128"></a>00128 <span class="keyword">class </span>AccessPolicy &gt; <span class="comment">//access policy: see AccessPtrMap</span>
+<a name="l00129"></a>00129 <span class="keyword">class </span>PtrIter : <span class="keyword">public</span> std::iterator&lt;std::input_iterator_tag, T&gt;, <span class="keyword">private</span> AccessPolicy <span class="comment">//get rid of shared_ptr indirection</span>
+<a name="l00130"></a>00130 {
+<a name="l00131"></a>00131 <span class="keyword">public</span>:
+<a name="l00132"></a>00132 PtrIter(IterTy it) : it_(it) {}
+<a name="l00133"></a>00133 PtrIter(<span class="keyword">const</span> PtrIter&amp; other) : it_(other.it_) {}
+<a name="l00134"></a>00134 PtrIter&amp; operator++() { ++it_; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l00135"></a>00135 PtrIter operator++(<span class="keywordtype">int</span>) { PtrIter tmp(*<span class="keyword">this</span>); operator++(); <span class="keywordflow">return</span> tmp; }
+<a name="l00136"></a>00136 <span class="keyword">inline</span> <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> PtrIter&amp; lhs, <span class="keyword">const</span> PtrIter&amp; rhs) { <span class="keywordflow">return</span> lhs.it_ == rhs.it_; }
+<a name="l00137"></a>00137 <span class="keyword">inline</span> <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> PtrIter&amp; lhs, <span class="keyword">const</span> PtrIter&amp; rhs) { <span class="keywordflow">return</span> !(lhs == rhs); }
+<a name="l00138"></a>00138 T&amp; operator* () { <span class="keywordflow">return</span> AccessPolicy::template objectRef&lt;T&gt;(it_); }
+<a name="l00139"></a>00139 T* operator-&gt;() { <span class="keywordflow">return</span> &amp;AccessPolicy::template objectRef&lt;T&gt;(it_); }
+<a name="l00140"></a>00140 <span class="keyword">private</span>:
+<a name="l00141"></a>00141 IterTy it_;
+<a name="l00142"></a>00142 };
+<a name="l00143"></a>00143
+<a name="l00144"></a>00144 <span class="keyword">struct </span>AccessPtrMap
+<a name="l00145"></a>00145 {
+<a name="l00146"></a>00146 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> IterTy&gt;
+<a name="l00147"></a>00147 T&amp; objectRef(<span class="keyword">const</span> IterTy&amp; it) { <span class="keywordflow">return</span> *(it-&gt;second); }
+<a name="l00148"></a>00148 };
+<a name="l00149"></a>00149
+<a name="l00150"></a>00150 <span class="keyword">typedef</span> PtrIter&lt;std::multimap&lt;std::string, std::shared_ptr&lt;XmlElement&gt;&gt;::iterator, XmlElement, AccessPtrMap&gt; ChildIter2;
+<a name="l00151"></a>00151 <span class="keyword">typedef</span> PtrIter&lt;std::multimap&lt;std::string, std::shared_ptr&lt;XmlElement&gt;&gt;::const_iterator, <span class="keyword">const</span> XmlElement, AccessPtrMap&gt; ChildIterConst2;
+<a name="l00152"></a>00152
+<a name="l00154"></a>00154
+<a name="l00163"></a>00163 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00164"></a><a class="code" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8">00164</a> std::pair&lt;ChildIterConst2, ChildIterConst2&gt; <a class="code" href="classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8" title="Access all child elements with the given name via STL iterators.">getChildren</a>(<span class="keyword">const</span> String&amp; name)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> childElementsSorted.equal_range(utfCvrtTo&lt;std::string&gt;(name)); }
+<a name="l00165"></a>00165
+<a name="l00167"></a>00167 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00168"></a><a class="code" href="classzen_1_1_xml_element.html#ae209dac9655bc36121abb87688ece41d">00168</a> std::pair&lt;ChildIter2, ChildIter2&gt; <a class="code" href="classzen_1_1_xml_element.html#ae209dac9655bc36121abb87688ece41d">getChildren</a>(<span class="keyword">const</span> String&amp; name) { <span class="keywordflow">return</span> childElementsSorted.equal_range(utfCvrtTo&lt;std::string&gt;(name)); }
+<a name="l00169"></a>00169
+<a name="l00170"></a>00170 <span class="keyword">struct </span>AccessPtrVec
+<a name="l00171"></a>00171 {
+<a name="l00172"></a>00172 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> IterTy&gt;
+<a name="l00173"></a>00173 T&amp; objectRef(<span class="keyword">const</span> IterTy&amp; it) { <span class="keywordflow">return</span> **it; }
+<a name="l00174"></a>00174 };
+<a name="l00175"></a>00175
+<a name="l00176"></a>00176 <span class="keyword">typedef</span> PtrIter&lt;std::vector&lt;std::shared_ptr&lt;XmlElement&gt;&gt;::iterator, XmlElement, AccessPtrVec&gt; ChildIter;
+<a name="l00177"></a>00177 <span class="keyword">typedef</span> PtrIter&lt;std::vector&lt;std::shared_ptr&lt;XmlElement&gt;&gt;::const_iterator, <span class="keyword">const</span> XmlElement, AccessPtrVec&gt; ChildIterConst;
+<a name="l00178"></a>00178
+<a name="l00180"></a>00180
+<a name="l00188"></a><a class="code" href="classzen_1_1_xml_element.html#a55a6d1849490d82ae900cd9b923908f2">00188</a> std::pair&lt;ChildIterConst, ChildIterConst&gt; <a class="code" href="classzen_1_1_xml_element.html#a55a6d1849490d82ae900cd9b923908f2" title="Access all child elements sequentially via STL iterators.">getChildren</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> std::make_pair(childElements.begin(), childElements.end()); }
+<a name="l00189"></a>00189
+<a name="l00191"></a><a class="code" href="classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96">00191</a> std::pair&lt;ChildIter, ChildIter&gt; <a class="code" href="classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96">getChildren</a>() { <span class="keywordflow">return</span> std::make_pair(childElements.begin(), childElements.end()); }
+<a name="l00192"></a>00192
+<a name="l00194"></a><a class="code" href="classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1">00194</a> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* <a class="code" href="classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1" title="Get parent XML element, may be nullptr for root element.">parent</a>() { <span class="keywordflow">return</span> parent_; };
+<a name="l00196"></a><a class="code" href="classzen_1_1_xml_element.html#a7ba1f26be5629f89ba7648d658f7058c">00196</a> <span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* <a class="code" href="classzen_1_1_xml_element.html#a7ba1f26be5629f89ba7648d658f7058c" title="Get parent XML element, may be nullptr for root element.">parent</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> parent_; };
+<a name="l00197"></a>00197
+<a name="l00198"></a>00198
+<a name="l00199"></a>00199 <span class="keyword">typedef</span> std::map&lt;std::string, std::string&gt;::const_iterator AttrIter;
+<a name="l00200"></a>00200
+<a name="l00201"></a>00201 <span class="comment">/* -&gt; disabled documentation extraction</span>
+<a name="l00202"></a>00202 <span class="comment"> \brief Get all attributes associated with the element.</span>
+<a name="l00203"></a>00203 <span class="comment"> \code</span>
+<a name="l00204"></a>00204 <span class="comment"> auto iterPair = elem.getAttributes();</span>
+<a name="l00205"></a>00205 <span class="comment"> for (auto it = iterPair.first; it != iterPair.second; ++it)</span>
+<a name="l00206"></a>00206 <span class="comment"> std::cout &lt;&lt; &quot;name: &quot; &lt;&lt; it-&gt;first &lt;&lt; &quot; value: &quot; &lt;&lt; it-&gt;second &lt;&lt; &quot;\n&quot;;</span>
+<a name="l00207"></a>00207 <span class="comment"> \endcode</span>
+<a name="l00208"></a>00208 <span class="comment"> \return A pair of STL begin/end iterators to access all attributes sequentially as a list of name/value pairs of std::string.</span>
+<a name="l00209"></a>00209 <span class="comment"> */</span>
+<a name="l00210"></a>00210 std::pair&lt;AttrIter, AttrIter&gt; getAttributes()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> std::make_pair(attributes.begin(), attributes.end()); }
+<a name="l00211"></a>00211
+<a name="l00212"></a>00212 <span class="comment">//Transactionally swap two elements. -&gt; disabled documentation extraction</span>
+<a name="l00213"></a>00213 <span class="keywordtype">void</span> swap(XmlElement&amp; other)
+<a name="l00214"></a>00214 {
+<a name="l00215"></a>00215 name_ .swap(other.name_);
+<a name="l00216"></a>00216 value_ .swap(other.value_);
+<a name="l00217"></a>00217 attributes.swap(other.attributes);
+<a name="l00218"></a>00218 childElements.swap(other.childElements);
+<a name="l00219"></a>00219 childElementsSorted.swap(other.childElementsSorted);
+<a name="l00220"></a>00220 <span class="comment">//std::swap(parent_, other.parent_); -&gt; parent is physical location; update children&#39;s parent reference instead:</span>
+<a name="l00221"></a>00221 std::for_each( childElements.begin(), childElements.end(), [&amp;](<span class="keyword">const</span> std::shared_ptr&lt;XmlElement&gt;&amp; child) { child-&gt;parent_ = <span class="keyword">this</span>; });
+<a name="l00222"></a>00222 std::for_each(other.childElements.begin(), other.childElements.end(), [&amp;](<span class="keyword">const</span> std::shared_ptr&lt;XmlElement&gt;&amp; child) { child-&gt;parent_ = &amp;other; });
+<a name="l00223"></a>00223 }
+<a name="l00224"></a>00224
+<a name="l00225"></a>00225 <span class="keyword">private</span>:
+<a name="l00226"></a>00226 <span class="keyword">friend</span> <span class="keyword">class </span>XmlDoc;
+<a name="l00227"></a>00227
+<a name="l00228"></a>00228 XmlElement(<span class="keyword">const</span> XmlElement&amp;); <span class="comment">//not implemented</span>
+<a name="l00229"></a>00229 XmlElement&amp; operator=(<span class="keyword">const</span> XmlElement&amp;); <span class="comment">//</span>
+<a name="l00230"></a>00230
+<a name="l00231"></a>00231 std::string name_;
+<a name="l00232"></a>00232 std::string value_;
+<a name="l00233"></a>00233 std::map&lt;std::string, std::string&gt; attributes;
+<a name="l00234"></a>00234 std::vector&lt;std::shared_ptr&lt;XmlElement&gt;&gt; childElements; <span class="comment">//all child elements in order of creation</span>
+<a name="l00235"></a>00235 std::multimap&lt;std::string, std::shared_ptr&lt;XmlElement&gt;&gt; childElementsSorted; <span class="comment">//alternate key: sorted by element name</span>
+<a name="l00236"></a>00236 XmlElement* parent_;
+<a name="l00237"></a>00237 };
+<a name="l00238"></a>00238
+<a name="l00239"></a>00239
+<a name="l00240"></a>00240 <span class="comment">//XmlElement::setValue&lt;T&gt;() calls zen::writeStruc() which calls XmlElement::setValue() ... =&gt; these two specializations end the circle</span>
+<a name="l00241"></a>00241 <span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<a name="l00242"></a>00242 <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01" title="Set the value of this element.">XmlElement::setValue</a>(<span class="keyword">const</span> std::string&amp; value) { value_ = value; }
+<a name="l00243"></a>00243
+<a name="l00244"></a>00244 <span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<a name="l00245"></a>00245 <span class="keywordtype">bool</span> <a class="code" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070" title="Get the value of this element as a user type.">XmlElement::getValue</a>(std::string&amp; value)<span class="keyword"> const </span>{ value = value_; <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00246"></a>00246
+<a name="l00247"></a>00247
+<a name="l00249"></a><a class="code" href="classzen_1_1_xml_doc.html">00249</a> <span class="keyword">class </span><a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>
+<a name="l00250"></a>00250 {
+<a name="l00251"></a>00251 <span class="keyword">public</span>:
+<a name="l00253"></a><a class="code" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed">00253</a> <a class="code" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed" title="Default constructor setting up an empty XML document with a standard declaration: &lt;...">XmlDoc</a>() : version_(<span class="stringliteral">&quot;1.0&quot;</span>), encoding_(<span class="stringliteral">&quot;UTF-8&quot;</span>), rootElement(<span class="stringliteral">&quot;Root&quot;</span>, nullptr, <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>::PrivateConstruction()) {}
+<a name="l00254"></a>00254
+<a name="l00255"></a>00255 <span class="comment">//Setup an empty XML document</span>
+<a name="l00260"></a>00260 <span class="comment"></span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00261"></a><a class="code" href="classzen_1_1_xml_doc.html#a74ff8434848672fe6483845d04c082df">00261</a> <a class="code" href="classzen_1_1_xml_doc.html#a74ff8434848672fe6483845d04c082df">XmlDoc</a>(String rootName) : version_(<span class="stringliteral">&quot;1.0&quot;</span>), encoding_(<span class="stringliteral">&quot;UTF-8&quot;</span>), rootElement(rootName, nullptr, <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>::PrivateConstruction()) {}
+<a name="l00262"></a>00262
+<a name="l00264"></a><a class="code" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d">00264</a> <span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; <a class="code" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d" title="Get a const reference to the document&#39;s root element.">root</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rootElement; }
+<a name="l00266"></a><a class="code" href="classzen_1_1_xml_doc.html#a094e156f9d265443e52a527638e88a1e">00266</a> <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; <a class="code" href="classzen_1_1_xml_doc.html#a094e156f9d265443e52a527638e88a1e" title="Get a reference to the document&#39;s root element.">root</a>() { <span class="keywordflow">return</span> rootElement; }
+<a name="l00267"></a>00267
+<a name="l00269"></a>00269
+<a name="l00272"></a>00272 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00273"></a><a class="code" href="classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665">00273</a> String <a class="code" href="classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665" title="Get the version used in the XML declaration.">getVersionAs</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> utfCvrtTo&lt;String&gt;(version_); }
+<a name="l00274"></a>00274
+<a name="l00276"></a>00276
+<a name="l00279"></a>00279 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00280"></a><a class="code" href="classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64">00280</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64" title="Set the version used in the XML declaration.">setVersion</a>(<span class="keyword">const</span> String&amp; version) { version_ = utfCvrtTo&lt;std::string&gt;(version); }
+<a name="l00281"></a>00281
+<a name="l00283"></a>00283
+<a name="l00286"></a>00286 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00287"></a><a class="code" href="classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da">00287</a> String <a class="code" href="classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da" title="Get the encoding used in the XML declaration.">getEncodingAs</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> utfCvrtTo&lt;String&gt;(encoding_); }
+<a name="l00288"></a>00288
+<a name="l00290"></a>00290
+<a name="l00293"></a>00293 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00294"></a><a class="code" href="classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62">00294</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62" title="Set the encoding used in the XML declaration.">setEncoding</a>(<span class="keyword">const</span> String&amp; encoding) { encoding_ = utfCvrtTo&lt;std::string&gt;(encoding); }
+<a name="l00295"></a>00295
+<a name="l00297"></a>00297
+<a name="l00300"></a>00300 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00301"></a><a class="code" href="classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4">00301</a> String <a class="code" href="classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4" title="Get the standalone string used in the XML declaration.">getStandaloneAs</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> utfCvrtTo&lt;String&gt;(standalone_); }
+<a name="l00302"></a>00302
+<a name="l00304"></a>00304
+<a name="l00307"></a>00307 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00308"></a><a class="code" href="classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4">00308</a> <span class="keywordtype">void</span> <a class="code" href="classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4" title="Set the standalone string used in the XML declaration.">setStandalone</a>(<span class="keyword">const</span> String&amp; standalone) { standalone_ = utfCvrtTo&lt;std::string&gt;(standalone); }
+<a name="l00309"></a>00309
+<a name="l00310"></a>00310 <span class="keyword">private</span>:
+<a name="l00311"></a>00311 <a class="code" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed" title="Default constructor setting up an empty XML document with a standard declaration: &lt;...">XmlDoc</a>(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp;); <span class="comment">//not implemented, thanks to XmlElement::parent_</span>
+<a name="l00312"></a>00312 <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp;); <span class="comment">//</span>
+<a name="l00313"></a>00313
+<a name="l00314"></a>00314 std::string version_;
+<a name="l00315"></a>00315 std::string encoding_;
+<a name="l00316"></a>00316 std::string standalone_;
+<a name="l00317"></a>00317
+<a name="l00318"></a>00318 <a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a> rootElement;
+<a name="l00319"></a>00319 };
+<a name="l00320"></a>00320
+<a name="l00321"></a>00321 }
+<a name="l00322"></a>00322
+<a name="l00323"></a>00323 <span class="preprocessor">#endif //ZEN_XML_DOM_HEADER_82085720723894567204564256</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/doxygen.css b/zenxml/doc/doxygen.css
new file mode 100644
index 00000000..c151fde3
--- /dev/null
+++ b/zenxml/doc/doxygen.css
@@ -0,0 +1,1012 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+ font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+ font-size: 13px;
+ line-height: 1.3;
+}
+
+/* @group Heading Levels */
+
+h1 {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+h3 {
+ font-size: 100%;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+.fragment {
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 8px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+ border-top: 1px solid #C4CFE5;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+}
+
+.memname {
+ white-space: nowrap;
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 8px;
+ border-top-left-radius: 8px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 8px;
+ -moz-border-radius-topleft: 8px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 8px;
+ -webkit-border-top-left-radius: 8px;
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 2px 5px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ /* opera specific markup */
+ border-bottom-left-radius: 8px;
+ border-bottom-right-radius: 8px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 8px;
+ -moz-border-radius-bottomright: 8px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 8px;
+ -webkit-border-bottom-right-radius: 8px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+
+.params, .retval, .exception, .tparams {
+ border-spacing: 6px 2px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+
+
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+ font-family: sans-serif;
+ margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+ font-size: 9pt;
+ font-weight: bold;
+ margin: 5px;
+}
+
+.directory h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice. Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+ height: 61px;
+ background-repeat: no-repeat;
+ background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+ display: none;
+}
+*/
+
+.directory > h3 {
+ margin-top: 0;
+}
+
+.directory p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory div {
+ display: none;
+ margin: 0px;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+ font-size: 100%;
+ font-weight: bold;
+}
+
+.directory-alt h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+.directory-alt > h3 {
+ margin-top: 0;
+}
+
+.directory-alt p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory-alt div {
+ display: none;
+ margin: 0px;
+}
+
+.directory-alt img {
+ vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ width: 100%;
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ margin-left: 5px;
+ font-size: 8pt;
+ padding-left: 5px;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 7px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+ border-left:4px solid;
+ padding: 0 0 0 6px;
+}
+
+dl.note
+{
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ border-color: #505050;
+}
+
+dl.todo
+{
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 20px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+ pre.fragment
+ {
+ overflow: visible;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ }
+}
+
diff --git a/zenxml/doc/doxygen.png b/zenxml/doc/doxygen.png
new file mode 100644
index 00000000..635ed52f
--- /dev/null
+++ b/zenxml/doc/doxygen.png
Binary files differ
diff --git a/zenxml/doc/error_8h_source.html b/zenxml/doc/error_8h_source.html
new file mode 100644
index 00000000..8986a17b
--- /dev/null
+++ b/zenxml/doc/error_8h_source.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: error.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">error.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_ERROR_HEADER_018734618433021489473214873214</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_ERROR_HEADER_018734618433021489473214873214</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="keyword">namespace </span>zen
+<a name="l00011"></a>00011 {
+<a name="l00013"></a><a class="code" href="structzen_1_1_xml_error.html">00013</a> <span class="keyword">struct </span><a class="code" href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml.">XmlError</a>
+<a name="l00014"></a>00014 {
+<a name="l00015"></a>00015 <span class="keyword">virtual</span> ~<a class="code" href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml.">XmlError</a>() {}
+<a name="l00016"></a>00016 };
+<a name="l00017"></a>00017 }
+<a name="l00018"></a>00018
+<a name="l00019"></a>00019 <span class="preprocessor">#endif //ZEN_XML_ERROR_HEADER_018734618433021489473214873214</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/files.html b/zenxml/doc/files.html
new file mode 100644
index 00000000..31fcf4fd
--- /dev/null
+++ b/zenxml/doc/files.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: File List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">File List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented files with brief descriptions:</div><table>
+ <tr><td class="indexkey"><b>bind.h</b> <a href="bind_8h_source.html">[code]</a></td><td class="indexvalue">Map user data types to XML </td></tr>
+ <tr><td class="indexkey"><b>cvrt_struc.h</b> <a href="cvrt__struc_8h_source.html">[code]</a></td><td class="indexvalue">Handle conversion of arbitrary types to and from XML elements. See comments in <a class="el" href="cvrt__text_8h_source.html" title="Handle conversion of string-convertible types to and from std::string.">cvrt_text.h</a> </td></tr>
+ <tr><td class="indexkey"><b>cvrt_text.h</b> <a href="cvrt__text_8h_source.html">[code]</a></td><td class="indexvalue">Handle conversion of string-convertible types to and from std::string </td></tr>
+ <tr><td class="indexkey"><b>dom.h</b> <a href="dom_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>error.h</b> <a href="error_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>io.h</b> <a href="io_8h_source.html">[code]</a></td><td class="indexvalue">Save and load byte streams from files </td></tr>
+ <tr><td class="indexkey"><b>parser.h</b> <a href="parser_8h_source.html">[code]</a></td><td class="indexvalue">Convert an XML document object model (class XmlDoc) to and from a byte stream representation </td></tr>
+ <tr><td class="indexkey"><b>xml.h</b> <a href="xml_8h_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+</table>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/functions.html b/zenxml/doc/functions.html
new file mode 100644
index 00000000..956af32d
--- /dev/null
+++ b/zenxml/doc/functions.html
@@ -0,0 +1,272 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Class Members</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_g"><span>g</span></a></li>
+ <li><a href="#index_l"><span>l</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_x"><span>x</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented class members with links to the class documentation for each member:</div>
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>addChild()
+: <a class="el" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9">zen::XmlElement</a>
+</li>
+<li>attribute()
+: <a class="el" href="classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01">zen::XmlIn</a>
+, <a class="el" href="classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805">zen::XmlOut</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>col
+: <a class="el" href="structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd">zen::XmlParsingError</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>errorsOccured()
+: <a class="el" href="classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a">zen::XmlIn</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>get()
+: <a class="el" href="classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f">zen::XmlIn</a>
+</li>
+<li>getAttribute()
+: <a class="el" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887">zen::XmlElement</a>
+</li>
+<li>getChild()
+: <a class="el" href="classzen_1_1_xml_element.html#a5d672e8ccc7592442ab927bb267af658">zen::XmlElement</a>
+</li>
+<li>getChildren()
+: <a class="el" href="classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96">zen::XmlElement</a>
+</li>
+<li>getEncodingAs()
+: <a class="el" href="classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da">zen::XmlDoc</a>
+</li>
+<li>getErrorsAs()
+: <a class="el" href="classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e">zen::XmlIn</a>
+</li>
+<li>getNameAs()
+: <a class="el" href="classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50">zen::XmlElement</a>
+</li>
+<li>getStandaloneAs()
+: <a class="el" href="classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4">zen::XmlDoc</a>
+</li>
+<li>getValue()
+: <a class="el" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070">zen::XmlElement</a>
+</li>
+<li>getVersionAs()
+: <a class="el" href="classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665">zen::XmlDoc</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>lastError
+: <a class="el" href="structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f">zen::XmlFileError</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>next()
+: <a class="el" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4">zen::XmlIn</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>operator int ConversionToBool::*()
+: <a class="el" href="classzen_1_1_xml_in.html#a954950849b52557369932ab2a8b4ad72">zen::XmlIn</a>
+</li>
+<li>operator()()
+: <a class="el" href="classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb">zen::XmlOut</a>
+, <a class="el" href="classzen_1_1_xml_in.html#a98cc59f687c89549381e76105f8fb506">zen::XmlIn</a>
+</li>
+<li>operator[]()
+: <a class="el" href="classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831">zen::XmlOut</a>
+, <a class="el" href="classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d">zen::XmlIn</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parent()
+: <a class="el" href="classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1">zen::XmlElement</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>ref()
+: <a class="el" href="classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2">zen::XmlOut</a>
+</li>
+<li>removeAttribute()
+: <a class="el" href="classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934">zen::XmlElement</a>
+</li>
+<li>root()
+: <a class="el" href="classzen_1_1_xml_doc.html#a094e156f9d265443e52a527638e88a1e">zen::XmlDoc</a>
+</li>
+<li>row
+: <a class="el" href="structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e">zen::XmlParsingError</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>setAttribute()
+: <a class="el" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421">zen::XmlElement</a>
+</li>
+<li>setEncoding()
+: <a class="el" href="classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62">zen::XmlDoc</a>
+</li>
+<li>setStandalone()
+: <a class="el" href="classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4">zen::XmlDoc</a>
+</li>
+<li>setValue()
+: <a class="el" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01">zen::XmlElement</a>
+</li>
+<li>setVersion()
+: <a class="el" href="classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64">zen::XmlDoc</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>XmlDoc()
+: <a class="el" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed">zen::XmlDoc</a>
+</li>
+<li>XmlIn()
+: <a class="el" href="classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430">zen::XmlIn</a>
+</li>
+<li>XmlOut()
+: <a class="el" href="classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0">zen::XmlOut</a>
+</li>
+</ul>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/functions_func.html b/zenxml/doc/functions_func.html
new file mode 100644
index 00000000..be8e5716
--- /dev/null
+++ b/zenxml/doc/functions_func.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Class Members - Functions</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_g"><span>g</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_x"><span>x</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>addChild()
+: <a class="el" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9">zen::XmlElement</a>
+</li>
+<li>attribute()
+: <a class="el" href="classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01">zen::XmlIn</a>
+, <a class="el" href="classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805">zen::XmlOut</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>errorsOccured()
+: <a class="el" href="classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a">zen::XmlIn</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>get()
+: <a class="el" href="classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f">zen::XmlIn</a>
+</li>
+<li>getAttribute()
+: <a class="el" href="classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887">zen::XmlElement</a>
+</li>
+<li>getChild()
+: <a class="el" href="classzen_1_1_xml_element.html#a5d672e8ccc7592442ab927bb267af658">zen::XmlElement</a>
+</li>
+<li>getChildren()
+: <a class="el" href="classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96">zen::XmlElement</a>
+</li>
+<li>getEncodingAs()
+: <a class="el" href="classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da">zen::XmlDoc</a>
+</li>
+<li>getErrorsAs()
+: <a class="el" href="classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e">zen::XmlIn</a>
+</li>
+<li>getNameAs()
+: <a class="el" href="classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50">zen::XmlElement</a>
+</li>
+<li>getStandaloneAs()
+: <a class="el" href="classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4">zen::XmlDoc</a>
+</li>
+<li>getValue()
+: <a class="el" href="classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070">zen::XmlElement</a>
+</li>
+<li>getVersionAs()
+: <a class="el" href="classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665">zen::XmlDoc</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>next()
+: <a class="el" href="classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4">zen::XmlIn</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>operator int ConversionToBool::*()
+: <a class="el" href="classzen_1_1_xml_in.html#a954950849b52557369932ab2a8b4ad72">zen::XmlIn</a>
+</li>
+<li>operator()()
+: <a class="el" href="classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb">zen::XmlOut</a>
+, <a class="el" href="classzen_1_1_xml_in.html#a98cc59f687c89549381e76105f8fb506">zen::XmlIn</a>
+</li>
+<li>operator[]()
+: <a class="el" href="classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831">zen::XmlOut</a>
+, <a class="el" href="classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d">zen::XmlIn</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parent()
+: <a class="el" href="classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1">zen::XmlElement</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>ref()
+: <a class="el" href="classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2">zen::XmlOut</a>
+</li>
+<li>removeAttribute()
+: <a class="el" href="classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934">zen::XmlElement</a>
+</li>
+<li>root()
+: <a class="el" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d">zen::XmlDoc</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>setAttribute()
+: <a class="el" href="classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421">zen::XmlElement</a>
+</li>
+<li>setEncoding()
+: <a class="el" href="classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62">zen::XmlDoc</a>
+</li>
+<li>setStandalone()
+: <a class="el" href="classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4">zen::XmlDoc</a>
+</li>
+<li>setValue()
+: <a class="el" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01">zen::XmlElement</a>
+</li>
+<li>setVersion()
+: <a class="el" href="classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64">zen::XmlDoc</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>XmlDoc()
+: <a class="el" href="classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed">zen::XmlDoc</a>
+</li>
+<li>XmlIn()
+: <a class="el" href="classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430">zen::XmlIn</a>
+</li>
+<li>XmlOut()
+: <a class="el" href="classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0">zen::XmlOut</a>
+</li>
+</ul>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/functions_vars.html b/zenxml/doc/functions_vars.html
new file mode 100644
index 00000000..ba8364ef
--- /dev/null
+++ b/zenxml/doc/functions_vars.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Class Members - Variables</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>col
+: <a class="el" href="structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd">zen::XmlParsingError</a>
+</li>
+<li>lastError
+: <a class="el" href="structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f">zen::XmlFileError</a>
+</li>
+<li>row
+: <a class="el" href="structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e">zen::XmlParsingError</a>
+</li>
+</ul>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/hierarchy.html b/zenxml/doc/hierarchy.html
new file mode 100644
index 00000000..363c134b
--- /dev/null
+++ b/zenxml/doc/hierarchy.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Class Hierarchy</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li class="current"><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Hierarchy</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">This inheritance list is sorted roughly, but not completely, alphabetically:</div><ul>
+<li><a class="el" href="classzen_1_1_xml_doc.html">zen::XmlDoc</a></li>
+<li><a class="el" href="classzen_1_1_xml_element.html">zen::XmlElement</a></li>
+<li><a class="el" href="structzen_1_1_xml_error.html">zen::XmlError</a><ul>
+<li><a class="el" href="structzen_1_1_xml_file_error.html">zen::XmlFileError</a></li>
+<li><a class="el" href="structzen_1_1_xml_parsing_error.html">zen::XmlParsingError</a></li>
+</ul>
+</li>
+<li><a class="el" href="classzen_1_1_xml_in.html">zen::XmlIn</a></li>
+<li><a class="el" href="classzen_1_1_xml_out.html">zen::XmlOut</a></li>
+</ul>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/index.html b/zenxml/doc/index.html
new file mode 100644
index 00000000..d7245a6b
--- /dev/null
+++ b/zenxml/doc/index.html
@@ -0,0 +1,679 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Overview</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li class="current"><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Overview </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><ul>
+<li><a class="el" href="index.html#sec_Rationale">Rationale</a> </li>
+<li><a class="el" href="index.html#sec_Quick_Start">Quick Start</a> </li>
+<li><a class="el" href="index.html#sec_Supported_Platforms">Supported Platforms</a> </li>
+<li><a class="el" href="index.html#sec_Flexible_Programming_Model">Flexible Programming Model</a> </li>
+<li><a class="el" href="index.html#sec_Structured_XML_element_access">Structured XML element access</a> </li>
+<li><a class="el" href="index.html#sec_Access_XML_attributes">Access XML attributes</a> </li>
+<li><a class="el" href="index.html#sec_Automatic_conversion_built_in">Automatic conversion for built-in arithmetic types</a> </li>
+<li><a class="el" href="index.html#sec_Automatic_conversion_string">Automatic conversion for string-like types</a> </li>
+<li><a class="el" href="index.html#sec_Automatic_conversion_STL">Automatic conversion for STL container types</a> </li>
+<li><a class="el" href="index.html#sec_Support_user_defined">Support for user-defined types</a> </li>
+<li><a class="el" href="index.html#sec_Structured_user_types">Structured user types</a> </li>
+<li><a class="el" href="index.html#sec_Type_Safety">Type Safety</a></li>
+</ul>
+<h2><a class="anchor" id="sec_Rationale"></a>
+Rationale</h2>
+<p>zen::Xml is an XML library serializing structured user data in a convenient way. Using compile-time information gathered by techniques of template metaprogramming it minimizes the manual overhead required and frees the user from implementing fundamental type conversions by himself. Basic data types such as</p>
+<ul>
+<li><b>all</b> built-in arithmetic numbers,</li>
+<li><b>all</b> kinds of string classes and "string-like" types,</li>
+<li><b>all</b> types defined as STL containers</li>
+</ul>
+<p>are handled automatically. Thereby a large number of recurring problems is solved by the library:</p>
+<ul>
+<li>generic number to string conversions</li>
+<li>generic char to wchar_t conversions (UTF) for custom string classes in a platform independent manner</li>
+<li>serialization of arbitrary STL container types</li>
+<li>simple integration: header-only, no extra dependencies, fully portable</li>
+<li>support arbitrary string classes everywhere: for file names, XML element names, attribute names, values, ...</li>
+<li>XML library built on C++11 with focus on elegance, minimal code size, flexibility and performance</li>
+<li>easily extensible API: allow for internationalization, fine-granular error handling, and custom file I/O</li>
+</ul>
+<p>The design follows the philosophy of the Loki library: <br/>
+ <a href="http://loki-lib.sourceforge.net/index.php?n=Main.Philosophy">http://loki-lib.sourceforge.net/index.php?n=Main.Philosophy</a></p>
+<h2><a class="anchor" id="sec_Quick_Start"></a>
+Quick Start</h2>
+<p>1. Download zen::Xml: <a href="http://sourceforge.net/projects/zenxml">http://sourceforge.net/projects/zenxml</a></p>
+<p>2. Setup a preprocessor macro for your project to identify the platform (this is only required if you use C-stream-based file IO) </p>
+<div class="fragment"><pre class="fragment"> ZEN_PLATFORM_WINDOWS
+ or
+ ZEN_PLATFORM_OTHER
+</pre></div><p>3. For optimal performance define this global macro in release build: (following convention of the <code>assert</code> macro) </p>
+<div class="fragment"><pre class="fragment"> NDEBUG
+</pre></div><p>4. Include the main header: </p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include &lt;zenxml/xml.h&gt;</span>
+</pre></div><p>5. Start serializing user data:</p>
+<div class="fragment"><pre class="fragment"><span class="keywordtype">size_t</span> a = 10;
+<span class="keywordtype">double</span> b = 2.0;
+<span class="keywordtype">int</span> c = -1;
+</pre></div><div class="fragment"><pre class="fragment"><a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc; <span class="comment">//empty XML document</span>
+
+<a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc); <span class="comment">//the simplest way to fill the document is to use a data output proxy</span>
+out[<span class="stringliteral">&quot;elem1&quot;</span>](a); <span class="comment">//</span>
+out[<span class="stringliteral">&quot;elem2&quot;</span>](b); <span class="comment">//map data types to XML elements</span>
+out[<span class="stringliteral">&quot;elem3&quot;</span>](c); <span class="comment">//</span>
+
+<span class="keywordflow">try</span>
+{
+ <a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d" title="Save XML document to a file.">save</a>(doc, <span class="stringliteral">&quot;file.xml&quot;</span>); <span class="comment">//throw zen::XmlFileError</span>
+}
+<span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">zen::XmlFileError</a>&amp; e) { <span class="comment">/* handle error */</span> }
+</pre></div><p>The following XML file will be created: </p>
+<div class="fragment"><pre class="fragment">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;Root&gt;
+ &lt;elem1&gt;10&lt;/elem1&gt;
+ &lt;elem2&gt;2.000000&lt;/elem2&gt;
+ &lt;elem3&gt;-1&lt;/elem3&gt;
+&lt;/Root&gt;
+</pre></div><p>Load an XML file and map its content to user data: </p>
+<div class="fragment"><pre class="fragment"><a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc; <span class="comment">//empty XML document</span>
+
+<span class="keywordflow">try</span>
+{
+ <a class="code" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee" title="Load XML document from a file.">load</a>(<span class="stringliteral">&quot;file.xml&quot;</span>, doc); <span class="comment">//throw XmlFileError, XmlParsingError</span>
+}
+<span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml.">zen::XmlError</a>&amp; e) { <span class="comment">/* handle error */</span> }
+
+<a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> in(doc); <span class="comment">//the simplest way to read the document is to use a data input proxy</span>
+in[<span class="stringliteral">&quot;elem1&quot;</span>](a); <span class="comment">//</span>
+in[<span class="stringliteral">&quot;elem2&quot;</span>](b); <span class="comment">//map XML elements into user data</span>
+in[<span class="stringliteral">&quot;elem3&quot;</span>](c); <span class="comment">//</span>
+
+<span class="comment">//check for mapping errors, i.e. missing elements or conversion errors: you may consider these as warnings only</span>
+<span class="keywordflow">if</span> (in.errorsOccured())
+{
+ std::vector&lt;std::wstring&gt; failedElements = in.getErrorsAs&lt;std::wstring&gt;();
+ <span class="comment">/* generate error message showing the XML element names that failed to convert */</span>
+}
+</pre></div><h2><a class="anchor" id="sec_Supported_Platforms"></a>
+Supported Platforms</h2>
+<p>zen::Xml is written in a platform independent manner and runs on any rudimentary C++11 compliant compiler. It has been tested successfully under:</p>
+<ul>
+<li>Windows:<ol type="1">
+<li>Visual C++ 2010 - 32 bit</li>
+<li>Visual C++ 2010 - 64 bit</li>
+<li>MinGW: GCC 4.5.2 - 32 bit</li>
+</ol>
+</li>
+</ul>
+<ul>
+<li>Linux:<ol type="1">
+<li>GCC 4.5.2 - 32 bit</li>
+<li>GCC 4.5.2 - 64 bit</li>
+</ol>
+</li>
+</ul>
+<ul>
+<li>Mac OS X:<ol type="1">
+<li>Clang 3.2 - 64 bit</li>
+</ol>
+</li>
+</ul>
+<p><b>Note:</b> In order to enable C++11 features in GCC it is required to specify either of the following compiler options: </p>
+<div class="fragment"><pre class="fragment">-std=c++11
+-std=c++0x
+-std=gnu++0x
+</pre></div><h2><a class="anchor" id="sec_Flexible_Programming_Model"></a>
+Flexible Programming Model</h2>
+<p>Depending on what granularity of control is required in a particular application, zen::Xml allows the user to choose between full control or simplicity. <br/>
+<br/>
+ The library is structured into the following parts, each of which can be used in isolation: <br/>
+<br/>
+ <b>&lt;File&gt;</b> <br/>
+ |<br/>
+ | <a class="el" href="io_8h_source.html" title="Save and load byte streams from files.">io.h</a><br/>
+ |<br/>
+ <b>&lt;Byte Stream&gt;</b><br/>
+ |<br/>
+ | <a class="el" href="parser_8h_source.html" title="Convert an XML document object model (class XmlDoc) to and from a byte stream representation.">parser.h</a><br/>
+ |<br/>
+ <b>&lt;Document Object Model&gt;</b><br/>
+ |<br/>
+ | <a class="el" href="bind_8h_source.html" title="Map user data types to XML.">bind.h</a><br/>
+ |<br/>
+ <b>&lt;C++ user data&gt;</b> <br/>
+<br/>
+</p>
+<ul>
+<li>Save an XML document to memory <div class="fragment"><pre class="fragment"><a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+ ... <span class="comment">//fill it</span>
+std::string stream = <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(doc); <span class="comment">//throw ()</span>
+<span class="comment">/* you now have a binary XML stream */</span>
+
+<a class="code" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2" title="Save byte stream to a file.">saveStream</a>(stream, <span class="stringliteral">&quot;file.xml&quot;</span>); <span class="comment">//throw XmlFileError</span>
+<span class="comment">//if all you need is to store XmlDoc in a file direcly you can use zen::save() instead</span>
+</pre></div></li>
+</ul>
+<ul>
+<li>Load XML document from memory <div class="fragment"><pre class="fragment"><span class="comment">//get XML byte stream:</span>
+std::string stream = <a class="code" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607" title="Load byte stream from a file.">loadStream</a>(<span class="stringliteral">&quot;file.xml&quot;</span>); <span class="comment">//throw XmlFileError</span>
+
+<a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+<span class="comment">//parse byte stream into an XML document:</span>
+<a class="code" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7" title="Load XML document from a byte stream.">parse</a>(stream, doc); <span class="comment">//throw XmlParsingError</span>
+<span class="comment">//if all you need is to load an XmlDoc from a file you can use zen::load() directly</span>
+</pre></div></li>
+</ul>
+<ul>
+<li>Fine-granular error checking with the data input proxy <div class="fragment"><pre class="fragment"><a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> in(doc);
+<span class="comment">//map XML elements into user data</span>
+<span class="keywordflow">if</span> (!in[<span class="stringliteral">&quot;elem1&quot;</span>](a))
+ <span class="keywordflow">throw</span> MyCustomException();
+<span class="keywordflow">if</span> (!in[<span class="stringliteral">&quot;elem2&quot;</span>](b))
+ <span class="keywordflow">throw</span> MyCustomException();
+<span class="keywordflow">if</span> (!in[<span class="stringliteral">&quot;elem3&quot;</span>](c))
+ <span class="keywordflow">throw</span> MyCustomException();
+
+<span class="comment">//if (in.errorsOccured()) ... &lt;- not required here: contains the same conversion errors checked manually before</span>
+</pre></div></li>
+</ul>
+<ul>
+<li>Access the Document Object Model directly (without input/output proxy) <br/>
+<br/>
+ The full power of type conversions which is available via the input/output proxy classes <a class="el" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> and <a class="el" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> is also available for the document object model! <div class="fragment"><pre class="fragment"><span class="keyword">using namespace </span>zen;
+
+<a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a> doc;
+
+<a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>&amp; child = doc.<a class="code" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d" title="Get a const reference to the document&#39;s root element.">root</a>().<a class="code" href="classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9" title="Create a new child element and return a reference to it.">addChild</a>(<span class="stringliteral">&quot;elem1&quot;</span>);
+child.<a class="code" href="classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01" title="Set the value of this element.">setValue</a>(1234);
+
+<a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d" title="Save XML document to a file.">save</a>(doc, <span class="stringliteral">&quot;file.xml&quot;</span>); <span class="comment">//throw XmlFileError</span>
+</pre></div> <br/>
+ <div class="fragment"><pre class="fragment"><span class="keyword">using namespace </span>zen;
+
+<a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a> doc;
+<a class="code" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee" title="Load XML document from a file.">load</a>(<span class="stringliteral">&quot;file.xml&quot;</span>, doc); <span class="comment">//throw XmlFileError, XmlParsingError</span>
+
+<a class="code" href="classzen_1_1_xml_element.html" title="An XML element.">XmlElement</a>* child = doc.<a class="code" href="classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d" title="Get a const reference to the document&#39;s root element.">root</a>().<a class="code" href="classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e" title="Retrieve a child element with the given name.">getChild</a>(<span class="stringliteral">&quot;elem1&quot;</span>);
+<span class="keywordflow">if</span> (child)
+{
+ <span class="keywordtype">int</span> value = -1;
+ <span class="keywordflow">if</span> (!child-&gt;getValue(value))
+ ... <span class="comment">//handle conversion error</span>
+}
+<span class="keywordflow">else</span>
+ ... <span class="comment">//XML element not found</span>
+</pre></div></li>
+</ul>
+<h2><a class="anchor" id="sec_Structured_XML_element_access"></a>
+Structured XML element access</h2>
+<div class="fragment"><pre class="fragment"><span class="comment">//write a value into one deeply nested XML element - note the different types used seamlessly: char[], wchar_t[], char, wchar_t, int</span>
+<a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+out[<span class="stringliteral">&quot;elemento1&quot;</span>][L<span class="stringliteral">&quot;элемент2&quot;</span>][L<span class="stringliteral">&quot;要素3&quot;</span>][L<span class="stringliteral">&quot;στοιχείο4&quot;</span>][<span class="stringliteral">&quot;elem5&quot;</span>][L<span class="stringliteral">&quot;元素6&quot;</span>][L<span class="stringliteral">&#39;元&#39;</span>][<span class="charliteral">&#39;z&#39;</span>](-1234);
+</pre></div><p>The resulting XML: </p>
+<div class="fragment"><pre class="fragment">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;Root&gt;
+ &lt;elemento1&gt;
+ &lt;элемент2&gt;
+ &lt;要素3&gt;
+ &lt;στοιχείο4&gt;
+ &lt;elem5&gt;
+ &lt;元素6&gt;
+ &lt;元&gt;
+ &lt;z&gt;-1234&lt;/z&gt;
+ &lt;/元&gt;
+ &lt;/元素6&gt;
+ &lt;/elem5&gt;
+ &lt;/στοιχείο4&gt;
+ &lt;/要素3&gt;
+ &lt;/элемент2&gt;
+ &lt;/elemento1&gt;
+&lt;/Root&gt;
+</pre></div><h2><a class="anchor" id="sec_Access_XML_attributes"></a>
+Access XML attributes</h2>
+<div class="fragment"><pre class="fragment"><a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+
+<a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr1&quot;</span>, -1); <span class="comment">//</span>
+out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr2&quot;</span>, 2.1); <span class="comment">//write data into XML attributes</span>
+out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr3&quot;</span>, <span class="keyword">true</span>); <span class="comment">//</span>
+
+<a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d" title="Save XML document to a file.">save</a>(doc, <span class="stringliteral">&quot;file.xml&quot;</span>); <span class="comment">//throw XmlFileError</span>
+</pre></div><p>The resulting XML: </p>
+<div class="fragment"><pre class="fragment">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;Root&gt;
+ &lt;elem attr1="-1" attr2="2.1" attr3="true"/&gt;
+&lt;/Root&gt;
+</pre></div><h2><a class="anchor" id="sec_Automatic_conversion_built_in"></a>
+Automatic conversion for built-in arithmetic types</h2>
+<p>All built-in arithmetic types and <code>bool</code> are detected at compile time and a proper conversion is applied. Common conversions for integer-like types such as <code>int</code>, <code>long</code>, <code>long long</code>, ect. as well as floating point types are optimized for maximum performance.</p>
+<div class="fragment"><pre class="fragment"><a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+
+out[<span class="stringliteral">&quot;int&quot;</span>] (-1234);
+out[<span class="stringliteral">&quot;double&quot;</span>](1.23);
+out[<span class="stringliteral">&quot;float&quot;</span>] (4.56f);
+out[<span class="stringliteral">&quot;ulong&quot;</span>] (1234UL);
+out[<span class="stringliteral">&quot;bool&quot;</span>] (<span class="keyword">false</span>);
+</pre></div><p>The resulting XML: </p>
+<div class="fragment"><pre class="fragment">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;Root&gt;
+ &lt;int&gt;-1234&lt;/int&gt;
+ &lt;double&gt;1.23&lt;/double&gt;
+ &lt;float&gt;4.56&lt;/float&gt;
+ &lt;ulong&gt;1234&lt;/ulong&gt;
+ &lt;bool&gt;false&lt;/bool&gt;
+&lt;/Root&gt;
+</pre></div><h2><a class="anchor" id="sec_Automatic_conversion_string"></a>
+Automatic conversion for string-like types</h2>
+<p>The document object model of zen::Xml internally stores all names and values as a std::string. Consequently everything that is not a std::string but is "string-like" is UTF-converted into a std::string representation. By default zen::Xml accepts all character arrays like <code>char[]</code>, <code>wchar_t[]</code>, <code>char*</code>, <code>wchar_t*</code>, single characters like <code>char</code>, <code>wchar_t</code>, standard string classes like <code>std::string</code>, <code>std::wstring</code> and user-defined string classes. If the input string is based on <code>char</code>, it will simply be copied and thereby preserves any local encodings. If the input string is based on <code>wchar_t</code> it will be converted to an UTF-8 encoded <code>std::string</code>. The correct <code>wchar_t</code> encoding of the system will be detected at compile time, for example UTF-16 on Windows, UTF-32 on most Linux distributions.</p>
+<p><b>Note:</b> User-defined string classes are automatically supported if they fulfill the following <b>string concept</b> by defining:</p>
+<ol type="1">
+<li>A typedef named <code>value_type</code> for the underlying character type: must be <code>char</code> or <code>wchar_t</code> </li>
+<li>A member function <code>c_str()</code> returning something that can be converted into a <code>const value_type*</code></li>
+<li>A member function <code>length()</code> returning the number of characters returned by <code>c_str()</code></li>
+</ol>
+<div class="fragment"><pre class="fragment">std::string elem1 = <span class="stringliteral">&quot;elemento1&quot;</span>;
+std::wstring elem2 = L<span class="stringliteral">&quot;элемент2&quot;</span>;
+wxString elem3 = L<span class="stringliteral">&quot;要素3&quot;</span>;
+MyString elem4 = L<span class="stringliteral">&quot;στοιχείο4&quot;</span>;
+
+<a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+
+out[<span class="stringliteral">&quot;string&quot;</span>] (elem1);
+out[<span class="stringliteral">&quot;wstring&quot;</span>] (elem2);
+out[<span class="stringliteral">&quot;wxString&quot;</span>] (elem3);
+out[<span class="stringliteral">&quot;MyString&quot;</span>] (elem4);
+out[<span class="stringliteral">&quot;char[6]&quot;</span>] (<span class="stringliteral">&quot;elem5&quot;</span>);
+out[<span class="stringliteral">&quot;wchar_t[4]&quot;</span>](L<span class="stringliteral">&quot;元素6&quot;</span>);
+out[<span class="stringliteral">&quot;wchar_t&quot;</span>] (L<span class="stringliteral">&#39;元&#39;</span>);
+out[<span class="stringliteral">&quot;char&quot;</span>] (<span class="charliteral">&#39;z&#39;</span>);
+</pre></div><p>The resulting XML: </p>
+<div class="fragment"><pre class="fragment">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;Root&gt;
+ &lt;string&gt;elemento1&lt;/string&gt;
+ &lt;wstring&gt;элемент2&lt;/wstring&gt;
+ &lt;wxString&gt;要素3&lt;/wxString&gt;
+ &lt;MyString&gt;στοιχείο4&lt;/MyString&gt;
+ &lt;char[6]&gt;elem5&lt;/char[6]&gt;
+ &lt;wchar_t[4]&gt;元素6&lt;/wchar_t[4]&gt;
+ &lt;wchar_t&gt;元&lt;/wchar_t&gt;
+ &lt;char&gt;z&lt;/char&gt;
+&lt;/Root&gt;
+</pre></div><h2><a class="anchor" id="sec_Automatic_conversion_STL"></a>
+Automatic conversion for STL container types</h2>
+<ul>
+<li>User-defined STL compatible types are automatically supported if they fulfill the following <b>container concept</b> by defining:<ol type="1">
+<li>A typedef named <code>value_type</code> for the underlying element type of the container</li>
+<li>A typedef named <code>iterator</code> for a non-const iterator into the container</li>
+<li>A typedef named <code>const_iterator</code> for a const iterator into the container <br/>
+<br/>
+</li>
+<li>A member function <code>begin()</code> returning an iterator pointing to the first element in the container</li>
+<li>A member function <code>end()</code> returning an iterator pointing just after the last element in the container</li>
+<li>A member function <code>insert()</code> with the signature <code>iterator insert(iterator position, const value_type&amp; x)</code></li>
+<li>A member function <code>clear()</code> removing all elements from the container</li>
+</ol>
+</li>
+</ul>
+<ul>
+<li>In order to support combinations of user types and STL containers such as <code>std::vector&lt;MyType&gt;</code> or <code>std::vector&lt;std::list&lt;MyType&gt;&gt;</code> it is sufficient to only integrate <code>MyType</code> into zen::Xml. <br/>
+ See <a class="el" href="index.html#sec_Support_user_defined">Support for user-defined types</a></li>
+</ul>
+<div class="fragment"><pre class="fragment">std::deque &lt;float&gt; testDeque;
+std::list &lt;size_t&gt; testList;
+std::map &lt;double, char&gt; testMap;
+std::multimap&lt;short, double&gt; testMultiMap;
+std::set &lt;int&gt; testSet;
+std::multiset&lt;std::string&gt; testMultiSet;
+std::vector &lt;wchar_t&gt; testVector;
+std::vector &lt;std::list&lt;wchar_t&gt;&gt; testVectorList;
+std::pair &lt;char, wchar_t&gt; testPair;
+
+<span class="comment">/* fill container */</span>
+
+<a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+
+out[<span class="stringliteral">&quot;deque&quot;</span>] (testDeque);
+out[<span class="stringliteral">&quot;list&quot;</span>] (testList);
+out[<span class="stringliteral">&quot;map&quot;</span>] (testMap);
+out[<span class="stringliteral">&quot;multimap&quot;</span>] (testMultiMap);
+out[<span class="stringliteral">&quot;set&quot;</span>] (testSet);
+out[<span class="stringliteral">&quot;multiset&quot;</span>] (testMultiSet);
+out[<span class="stringliteral">&quot;vector&quot;</span>] (testVector);
+out[<span class="stringliteral">&quot;vect_list&quot;</span>](testVectorList);
+out[<span class="stringliteral">&quot;pair&quot;</span> ] (testPair);
+</pre></div><p>The resulting XML: </p>
+<div class="fragment"><pre class="fragment">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;Root&gt;
+ &lt;deque&gt;
+ &lt;Item&gt;1.234&lt;/Item&gt;
+ &lt;Item&gt;5.678&lt;/Item&gt;
+ &lt;/deque&gt;
+ &lt;list&gt;
+ &lt;Item&gt;1&lt;/Item&gt;
+ &lt;Item&gt;2&lt;/Item&gt;
+ &lt;/list&gt;
+ &lt;map&gt;
+ &lt;Item&gt;
+ &lt;one&gt;1.1&lt;/one&gt;
+ &lt;two&gt;a&lt;/two&gt;
+ &lt;/Item&gt;
+ &lt;Item&gt;
+ &lt;one&gt;2.2&lt;/one&gt;
+ &lt;two&gt;b&lt;/two&gt;
+ &lt;/Item&gt;
+ &lt;/map&gt;
+ &lt;multimap&gt;
+ &lt;Item&gt;
+ &lt;one&gt;3&lt;/one&gt;
+ &lt;two&gt;99&lt;/two&gt;
+ &lt;/Item&gt;
+ &lt;Item&gt;
+ &lt;one&gt;3&lt;/one&gt;
+ &lt;two&gt;100&lt;/two&gt;
+ &lt;/Item&gt;
+ &lt;Item&gt;
+ &lt;one&gt;4&lt;/one&gt;
+ &lt;two&gt;101&lt;/two&gt;
+ &lt;/Item&gt;
+ &lt;/multimap&gt;
+ &lt;set&gt;
+ &lt;Item&gt;1&lt;/Item&gt;
+ &lt;Item&gt;2&lt;/Item&gt;
+ &lt;/set&gt;
+ &lt;multiset&gt;
+ &lt;Item&gt;1&lt;/Item&gt;
+ &lt;Item&gt;1&lt;/Item&gt;
+ &lt;Item&gt;2&lt;/Item&gt;
+ &lt;/multiset&gt;
+ &lt;vector&gt;
+ &lt;Item&gt;Ä&lt;/Item&gt;
+ &lt;Item&gt;Ö&lt;/Item&gt;
+ &lt;/vector&gt;
+ &lt;vect_list&gt;
+ &lt;Item&gt;
+ &lt;Item&gt;ä&lt;/Item&gt;
+ &lt;Item&gt;ö&lt;/Item&gt;
+ &lt;Item&gt;ü&lt;/Item&gt;
+ &lt;/Item&gt;
+ &lt;Item&gt;
+ &lt;Item&gt;ä&lt;/Item&gt;
+ &lt;Item&gt;ö&lt;/Item&gt;
+ &lt;Item&gt;ü&lt;/Item&gt;
+ &lt;/Item&gt;
+ &lt;/vect_list&gt;
+ &lt;pair&gt;
+ &lt;one&gt;a&lt;/one&gt;
+ &lt;two&gt;â&lt;/two&gt;
+ &lt;/pair&gt;
+&lt;/Root&gt;
+</pre></div><h2><a class="anchor" id="sec_Support_user_defined"></a>
+Support for user-defined types</h2>
+<p>User types can be integrated into zen::Xml by providing specializations of <a class="el" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">zen::readText()</a> and <a class="el" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">zen::writeText()</a> or <a class="el" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">zen::readStruc()</a> and <a class="el" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">zen::writeStruc()</a>. The first pair should be used for all non-structured types that can be represented as a simple text string. This specialization is then used to convert the type to XML elements and XML attributes. The second pair should be specialized for structured types that require an XML representation as a hierarchy of elements. This specialization is used when converting the type to XML elements only. <br/>
+<br/>
+ See section <a class="el" href="index.html#sec_Type_Safety">Type Safety</a> for a discussion of type categories. <br/>
+<br/>
+ <b>Example: Specialization for an enum type</b> </p>
+<div class="fragment"><pre class="fragment"><span class="keyword">enum</span> UnitTime
+{
+ UNIT_SECOND,
+ UNIT_MINUTE,
+ UNIT_HOUR
+};
+
+<span class="keyword">namespace </span>zen
+{
+<span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(<span class="keyword">const</span> UnitTime&amp; value, std::string&amp; output)
+{
+ <span class="keywordflow">switch</span> (value)
+ {
+ <span class="keywordflow">case</span> UNIT_SECOND: output = <span class="stringliteral">&quot;second&quot;</span>; <span class="keywordflow">break</span>;
+ <span class="keywordflow">case</span> UNIT_MINUTE: output = <span class="stringliteral">&quot;minute&quot;</span>; <span class="keywordflow">break</span>;
+ <span class="keywordflow">case</span> UNIT_HOUR: output = <span class="stringliteral">&quot;hour&quot;</span> ; <span class="keywordflow">break</span>;
+ }
+}
+
+<span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(<span class="keyword">const</span> std::string&amp; input, UnitTime&amp; value)
+{
+ std::string tmp = input;
+ zen::trim(tmp);
+ <span class="keywordflow">if</span> (tmp == <span class="stringliteral">&quot;second&quot;</span>)
+ value = UNIT_SECOND;
+ <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tmp == <span class="stringliteral">&quot;minute&quot;</span>)
+ value = UNIT_MINUTE;
+ <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tmp == <span class="stringliteral">&quot;hour&quot;</span>)
+ value = UNIT_HOUR;
+ <span class="keywordflow">else</span>
+ <span class="keywordflow">return</span> <span class="keyword">false</span>;
+ <span class="keywordflow">return</span> <span class="keyword">true</span>;
+}
+}
+</pre></div><p><b>Example: Brute-force specialization for an enum type</b> </p>
+<div class="fragment"><pre class="fragment"><span class="keyword">namespace </span>zen
+{
+<span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f" title="Convert user data into text - used by XML elements and attributes.">writeText</a>(<span class="keyword">const</span> EnumType&amp; value, std::string&amp; output)
+{
+ output = zen::numberTo&lt;std::string&gt;(<span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(value)); <span class="comment">//treat enum like an integer</span>
+}
+
+<span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff" title="Convert text to user data - used by XML elements and attributes.">readText</a>(<span class="keyword">const</span> std::string&amp; input, EnumType&amp; value)
+{
+ value = <span class="keyword">static_cast&lt;</span>EnumType<span class="keyword">&gt;</span>(zen::stringTo&lt;int&gt;(input)); <span class="comment">//treat enum like an integer</span>
+ <span class="keywordflow">return</span> <span class="keyword">true</span>;
+}
+}
+</pre></div><p><b>Example: Specialization for a structured user type</b> </p>
+<div class="fragment"><pre class="fragment"><span class="keyword">struct </span>Config
+{
+ <span class="keywordtype">int</span> a;
+ std::wstring b;
+};
+
+<span class="keyword">namespace </span>zen
+{
+<span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">writeStruc</a>(<span class="keyword">const</span> Config&amp; value, XmlElement&amp; output)
+{
+ XmlOut out(output);
+ out[<span class="stringliteral">&quot;number&quot;</span> ](value.a);
+ out[<span class="stringliteral">&quot;address&quot;</span>](value.b);
+}
+
+<span class="keyword">template</span> &lt;&gt; <span class="keyword">inline</span>
+<span class="keywordtype">bool</span> <a class="code" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">readStruc</a>(<span class="keyword">const</span> XmlElement&amp; input, Config&amp; value)
+{
+ XmlIn in(input);
+ <span class="keywordtype">bool</span> rv1 = in[<span class="stringliteral">&quot;number&quot;</span> ](value.a);
+ <span class="keywordtype">bool</span> rv2 = in[<span class="stringliteral">&quot;address&quot;</span>](value.b);
+ <span class="keywordflow">return</span> rv1 &amp;&amp; rv2;
+}
+}
+
+<span class="keywordtype">int</span> main()
+{
+ Config cfg = { 2, L<span class="stringliteral">&quot;Abc 3&quot;</span> };
+
+ std::vector&lt;Config&gt; cfgList;
+ cfgList.push_back(cfg);
+
+ <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc;
+ <a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc); <span class="comment">//write to Xml via output proxy</span>
+ out[<span class="stringliteral">&quot;config&quot;</span>](cfgList);
+ <a class="code" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d" title="Save XML document to a file.">save</a>(doc, <span class="stringliteral">&quot;file.xml&quot;</span>); <span class="comment">//throw XmlFileError</span>
+}
+</pre></div><p>The resulting XML: </p>
+<div class="fragment"><pre class="fragment">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;Root&gt;
+ &lt;config&gt;
+ &lt;Item&gt;
+ &lt;number&gt;2&lt;/number&gt;
+ &lt;address&gt;Abc 3&lt;/address&gt;
+ &lt;/Item&gt;
+ &lt;/config&gt;
+&lt;/Root&gt;
+</pre></div><h2><a class="anchor" id="sec_Structured_user_types"></a>
+Structured user types</h2>
+<p>Although it is possible to enable conversion of structured user types by specializing <a class="el" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1" title="Convert XML element to structured user data.">zen::readStruc()</a> and <a class="el" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6" title="Convert structured user data into an XML element.">zen::writeStruc()</a> (see <a class="el" href="index.html#sec_Support_user_defined">Support for user-defined types</a>), this approach has one drawback: If a mapping error occurs when converting an XML element to structured user data, for example a child-element is missing, the input proxy class <a class="el" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> is only able to detect that the whole conversion failed. It cannot say which child-elements in particular failed to convert. <br/>
+<br/>
+ Therefore it may be appropriate to convert structured types by calling subroutines in order to enable fine-granular logging:</p>
+<div class="fragment"><pre class="fragment"><span class="keywordtype">void</span> readConfig(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a>&amp; in, Config&amp; cfg)
+{
+ in[<span class="stringliteral">&quot;number&quot;</span> ](value.a); <span class="comment">//failed conversions will now be logged for each single item by XmlIn</span>
+ in[<span class="stringliteral">&quot;address&quot;</span>](value.b); <span class="comment">//instead of only once for the complete Config type!</span>
+}
+
+
+<span class="keywordtype">void</span> loadConfig(<span class="keyword">const</span> wxString&amp; filename, Config&amp; cfg)
+{
+ <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">zen::XmlDoc</a> doc; <span class="comment">//empty XML document</span>
+
+ <span class="keywordflow">try</span>
+ {
+ <a class="code" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee" title="Load XML document from a file.">load</a>(filename, doc); <span class="comment">//throw XmlFileError, XmlParsingError</span>
+ }
+ <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml.">zen::XmlError</a>&amp; e) { <span class="comment">/* handle error */</span> }
+
+ <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> in(doc);
+
+ <a class="code" href="classzen_1_1_xml_in.html" title="Proxy class to conveniently convert XML structure to user data.">zen::XmlIn</a> inConfig = in[<span class="stringliteral">&quot;config&quot;</span>]; <span class="comment">//get input proxy for child element &quot;config&quot;</span>
+
+ readConfig(inConfig, cfg); <span class="comment">//map child element to user data by calling subroutine</span>
+
+ <span class="comment">//check for mapping errors: errors occuring in subroutines are considered, too!</span>
+ <span class="keywordflow">if</span> (in.errorsOccured())
+ <span class="comment">/* show mapping errors */</span>
+}
+</pre></div><h2><a class="anchor" id="sec_Type_Safety"></a>
+Type Safety</h2>
+<p>zen::Xml heavily uses methods of compile-time introspection in order to free the user from managing basic type conversions by himself. Thereby it is important to find the right balance between automatic conversions and type safety so that program correctness is not compromised. In the context of XML processing three fundamental type categories can be recognized:</p>
+<ul>
+<li><b>string-like types</b>: <code>std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ...</code></li>
+<li><b>to-string-convertible types</b>: any string-like type, all built-in arithmetic numbers, <code>bool</code></li>
+<li><b>structured types</b>: any to-string-convertible type, STL containers, <code>std::pair</code>, structured user types</li>
+</ul>
+<p>These categories can be seen as a sequence of inclusive sets: </p>
+<div class="fragment"><pre class="fragment">-----------------------------
+| structured | Used as: XML element value
+| ------------------------- | Conversion via: readStruc(), writeStruc() - may be specialized for user-defined types!
+| | to-string-convertible | | Used as: XML element/attribute value
+| | --------------- | | Conversion via: readText(), writeText() - may be specialized for user-defined types!
+| | | string-like | | | Used as: XML element/attribute value or element name
+| | --------------- | | Conversion via: utfCvrtTo&lt;&gt;()
+| ------------------------- |
+-----------------------------
+</pre></div><p>A practical implication of this design is that conversions that do not make sense in a particular context simply lead to compile-time errors: </p>
+<div class="fragment"><pre class="fragment"><a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+out[L<span class="charliteral">&#39;Z&#39;</span>](someValue); <span class="comment">//fine: a wchar_t is acceptable as an element name</span>
+out[1234](someValue); <span class="comment">//compiler error: an integer is NOT &quot;string-like&quot;!</span>
+</pre></div><p> <br/>
+ </p>
+<div class="fragment"><pre class="fragment"><span class="keywordtype">int</span> i = 0;
+std::vector&lt;int&gt; v;
+
+<a class="code" href="classzen_1_1_xml_out.html" title="Proxy class to conveniently convert user data into XML structure.">zen::XmlOut</a> out(doc);
+out[<span class="stringliteral">&quot;elem1&quot;</span>](i); <span class="comment">//fine: both i and v can be converted to an XML element</span>
+out[<span class="stringliteral">&quot;elem2&quot;</span>](v); <span class="comment">//</span>
+
+out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr1&quot;</span>, i); <span class="comment">//fine: an integer can be converted to an XML attribute</span>
+out[<span class="stringliteral">&quot;elem&quot;</span>].attribute(<span class="stringliteral">&quot;attr2&quot;</span>, v); <span class="comment">//compiler error: a std::vector&lt;int&gt; is NOT &quot;to-string-convertible&quot;!</span>
+</pre></div><dl class="section author"><dt>Author:</dt><dd><b>Zenju</b> <br/>
+<br/>
+ <b>Email:</b> zenju AT gmx DOT de </dd></dl>
+</div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/io_8h_source.html b/zenxml/doc/io_8h_source.html
new file mode 100644
index 00000000..09ec749d
--- /dev/null
+++ b/zenxml/doc/io_8h_source.html
@@ -0,0 +1,213 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: io.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">io.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_IO_HEADER_8917640501480763248343343</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_IO_HEADER_8917640501480763248343343</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;cstdio&gt;</span>
+<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;cerrno&gt;</span>
+<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;zen/scope_guard.h&gt;</span>
+<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;zen/utf.h&gt;</span>
+<a name="l00014"></a>00014 <span class="preprocessor">#include &quot;error.h&quot;</span>
+<a name="l00015"></a>00015
+<a name="l00016"></a>00016 <span class="keyword">namespace </span>zen
+<a name="l00017"></a>00017 {
+<a name="l00023"></a>00023 <span class="preprocessor">#if !defined(ZEN_PLATFORM_WINDOWS) &amp;&amp; !defined(ZEN_PLATFORM_OTHER)</span>
+<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#error Please specify your platform: #define ZEN_PLATFORM_WINDOWS or ZEN_PLATFORM_OTHER</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span>
+<a name="l00028"></a><a class="code" href="structzen_1_1_xml_file_error.html">00028</a> <span class="keyword">struct </span><a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a> : <span class="keyword">public</span> <a class="code" href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml.">XmlError</a>
+<a name="l00029"></a>00029 {
+<a name="l00030"></a>00030 <span class="keyword">typedef</span> <span class="keywordtype">int</span> ErrorCode;
+<a name="l00031"></a>00031
+<a name="l00032"></a>00032 <span class="keyword">explicit</span> <a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a>(ErrorCode ec) : <a class="code" href="structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f" title="Native error code: errno.">lastError</a>(ec) {}
+<a name="l00034"></a><a class="code" href="structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f">00034</a> ErrorCode <a class="code" href="structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f" title="Native error code: errno.">lastError</a>;
+<a name="l00035"></a>00035 };
+<a name="l00036"></a>00036
+<a name="l00037"></a>00037
+<a name="l00038"></a>00038 <span class="preprocessor">#ifdef ZEN_PLATFORM_WINDOWS</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="keyword">namespace </span>implemenation <span class="comment">//sad but true</span>
+<a name="l00040"></a>00040 {
+<a name="l00041"></a>00041 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt; <span class="keyword">inline</span>
+<a name="l00042"></a>00042 FILE* fopen(<span class="keyword">const</span> String&amp; filename, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* mode)
+<a name="l00043"></a>00043 {
+<a name="l00044"></a>00044 <span class="preprocessor">#ifdef _MSC_VER</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span> FILE* handle = <span class="keyword">nullptr</span>;
+<a name="l00046"></a>00046 errno_t rv = ::_wfopen_s(&amp;handle, utfCvrtTo&lt;std::wstring&gt;(filename).c_str(), mode); <span class="comment">//more secure?</span>
+<a name="l00047"></a>00047 (void)rv;
+<a name="l00048"></a>00048 <span class="keywordflow">return</span> handle;
+<a name="l00049"></a>00049 <span class="preprocessor">#else</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span> return ::_wfopen(utfCvrtTo&lt;std::wstring&gt;(filename).c_str(), mode);
+<a name="l00051"></a>00051 <span class="preprocessor">#endif</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span>}
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span>
+<a name="l00056"></a>00056
+<a name="l00058"></a>00058
+<a name="l00064"></a>00064 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00065"></a><a class="code" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2">00065</a> <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2" title="Save byte stream to a file.">saveStream</a>(<span class="keyword">const</span> std::string&amp; stream, <span class="keyword">const</span> String&amp; filename) <span class="comment">//throw XmlFileError</span>
+<a name="l00066"></a>00066 {
+<a name="l00067"></a>00067 <span class="preprocessor">#ifdef ZEN_PLATFORM_WINDOWS</span>
+<a name="l00068"></a>00068 <span class="preprocessor"></span> FILE* handle = implemenation::fopen(utfCvrtTo&lt;std::wstring&gt;(filename).c_str(), L<span class="stringliteral">&quot;wb&quot;</span>);
+<a name="l00069"></a>00069 <span class="preprocessor">#else</span>
+<a name="l00070"></a>00070 <span class="preprocessor"></span> FILE* handle = ::fopen(utfCvrtTo&lt;std::string&gt;(filename).c_str(), <span class="stringliteral">&quot;w&quot;</span>);
+<a name="l00071"></a>00071 <span class="preprocessor">#endif</span>
+<a name="l00072"></a>00072 <span class="preprocessor"></span> <span class="keywordflow">if</span> (handle == <span class="keyword">nullptr</span>)
+<a name="l00073"></a>00073 <span class="keywordflow">throw</span> <a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a>(errno);
+<a name="l00074"></a>00074 ZEN_ON_SCOPE_EXIT(::fclose(handle));
+<a name="l00075"></a>00075
+<a name="l00076"></a>00076 <span class="keyword">const</span> <span class="keywordtype">size_t</span> bytesWritten = ::fwrite(stream.c_str(), 1, stream.size(), handle);
+<a name="l00077"></a>00077 <span class="keywordflow">if</span> (::ferror(handle) != 0)
+<a name="l00078"></a>00078 <span class="keywordflow">throw</span> <a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a>(errno);
+<a name="l00079"></a>00079
+<a name="l00080"></a>00080 (void)bytesWritten;
+<a name="l00081"></a>00081 assert(bytesWritten == stream.size());
+<a name="l00082"></a>00082 }
+<a name="l00083"></a>00083
+<a name="l00084"></a>00084
+<a name="l00086"></a>00086
+<a name="l00092"></a>00092 <span class="keyword">template</span> &lt;<span class="keyword">class</span> String&gt;
+<a name="l00093"></a><a class="code" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607">00093</a> std::string <a class="code" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607" title="Load byte stream from a file.">loadStream</a>(<span class="keyword">const</span> String&amp; filename) <span class="comment">//throw XmlFileError</span>
+<a name="l00094"></a>00094 {
+<a name="l00095"></a>00095 <span class="preprocessor">#ifdef ZEN_PLATFORM_WINDOWS</span>
+<a name="l00096"></a>00096 <span class="preprocessor"></span> FILE* handle = implemenation::fopen(utfCvrtTo&lt;std::wstring&gt;(filename).c_str(), L<span class="stringliteral">&quot;rb&quot;</span>);
+<a name="l00097"></a>00097 <span class="preprocessor">#else</span>
+<a name="l00098"></a>00098 <span class="preprocessor"></span> FILE* handle = ::fopen(utfCvrtTo&lt;std::string&gt;(filename).c_str(), <span class="stringliteral">&quot;r&quot;</span>);
+<a name="l00099"></a>00099 <span class="preprocessor">#endif</span>
+<a name="l00100"></a>00100 <span class="preprocessor"></span> <span class="keywordflow">if</span> (handle == <span class="keyword">nullptr</span>)
+<a name="l00101"></a>00101 <span class="keywordflow">throw</span> <a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a>(errno);
+<a name="l00102"></a>00102 ZEN_ON_SCOPE_EXIT(::fclose(handle));
+<a name="l00103"></a>00103
+<a name="l00104"></a>00104 std::string stream;
+<a name="l00105"></a>00105 <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockSize = 64 * 1024;
+<a name="l00106"></a>00106 <span class="keywordflow">do</span>
+<a name="l00107"></a>00107 {
+<a name="l00108"></a>00108 stream.resize(stream.size() + blockSize); <span class="comment">//let&#39;s pray std::string implements exponential growth!</span>
+<a name="l00109"></a>00109
+<a name="l00110"></a>00110 <span class="keyword">const</span> <span class="keywordtype">size_t</span> bytesRead = ::fread(&amp;*(stream.begin() + stream.size() - blockSize), 1, blockSize, handle);
+<a name="l00111"></a>00111 <span class="keywordflow">if</span> (::ferror(handle))
+<a name="l00112"></a>00112 <span class="keywordflow">throw</span> <a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a>(errno);
+<a name="l00113"></a>00113 <span class="keywordflow">if</span> (bytesRead &gt; blockSize)
+<a name="l00114"></a>00114 <span class="keywordflow">throw</span> <a class="code" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a>(0);
+<a name="l00115"></a>00115 <span class="keywordflow">if</span> (bytesRead &lt; blockSize)
+<a name="l00116"></a>00116 stream.resize(stream.size() - (blockSize - bytesRead)); <span class="comment">//caveat: unsigned arithmetics</span>
+<a name="l00117"></a>00117 }
+<a name="l00118"></a>00118 <span class="keywordflow">while</span> (!::feof(handle));
+<a name="l00119"></a>00119
+<a name="l00120"></a>00120 <span class="keywordflow">return</span> stream;
+<a name="l00121"></a>00121 }
+<a name="l00122"></a>00122 }
+<a name="l00123"></a>00123
+<a name="l00124"></a>00124 <span class="preprocessor">#endif //ZEN_XML_IO_HEADER_8917640501480763248343343</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/jquery.js b/zenxml/doc/jquery.js
new file mode 100644
index 00000000..90b3a2bc
--- /dev/null
+++ b/zenxml/doc/jquery.js
@@ -0,0 +1,64 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
+
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/zenxml/doc/namespacemembers.html b/zenxml/doc/namespacemembers.html
new file mode 100644
index 00000000..fe4340e5
--- /dev/null
+++ b/zenxml/doc/namespacemembers.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Namespace Members</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented namespace members with links to the namespaces they belong to:</div><ul>
+<li>load()
+: <a class="el" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee">zen</a>
+</li>
+<li>loadStream()
+: <a class="el" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607">zen</a>
+</li>
+<li>parse()
+: <a class="el" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7">zen</a>
+</li>
+<li>readStruc()
+: <a class="el" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1">zen</a>
+</li>
+<li>readText()
+: <a class="el" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff">zen</a>
+</li>
+<li>save()
+: <a class="el" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d">zen</a>
+</li>
+<li>saveStream()
+: <a class="el" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2">zen</a>
+</li>
+<li>serialize()
+: <a class="el" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee">zen</a>
+</li>
+<li>writeStruc()
+: <a class="el" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6">zen</a>
+</li>
+<li>writeText()
+: <a class="el" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f">zen</a>
+</li>
+</ul>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/namespacemembers_func.html b/zenxml/doc/namespacemembers_func.html
new file mode 100644
index 00000000..dd473af8
--- /dev/null
+++ b/zenxml/doc/namespacemembers_func.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Namespace Members</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li class="current"><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>load()
+: <a class="el" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee">zen</a>
+</li>
+<li>loadStream()
+: <a class="el" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607">zen</a>
+</li>
+<li>parse()
+: <a class="el" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7">zen</a>
+</li>
+<li>readStruc()
+: <a class="el" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1">zen</a>
+</li>
+<li>readText()
+: <a class="el" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff">zen</a>
+</li>
+<li>save()
+: <a class="el" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d">zen</a>
+</li>
+<li>saveStream()
+: <a class="el" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2">zen</a>
+</li>
+<li>serialize()
+: <a class="el" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee">zen</a>
+</li>
+<li>writeStruc()
+: <a class="el" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6">zen</a>
+</li>
+<li>writeText()
+: <a class="el" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f">zen</a>
+</li>
+</ul>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/namespaces.html b/zenxml/doc/namespaces.html
new file mode 100644
index 00000000..6a17ec0a
--- /dev/null
+++ b/zenxml/doc/namespaces.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Namespace List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Namespace List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented namespaces with brief descriptions:</div><table>
+ <tr><td class="indexkey"><a class="el" href="namespacezen.html">zen</a></td><td class="indexvalue">The zen::Xml namespace </td></tr>
+</table>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/namespacezen.html b/zenxml/doc/namespacezen.html
new file mode 100644
index 00000000..c05f255c
--- /dev/null
+++ b/zenxml/doc/namespacezen.html
@@ -0,0 +1,613 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen Namespace Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div>
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zen Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>The zen::Xml namespace.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_out.html">XmlOut</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Proxy class to conveniently convert user data into XML structure. <a href="classzen_1_1_xml_out.html#details">More...</a><br/></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_in.html">XmlIn</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Proxy class to conveniently convert XML structure to user data. <a href="classzen_1_1_xml_in.html#details">More...</a><br/></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_element.html">XmlElement</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">An XML element. <a href="classzen_1_1_xml_element.html#details">More...</a><br/></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">The complete XML document. <a href="classzen_1_1_xml_doc.html#details">More...</a><br/></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzen_1_1_xml_error.html">XmlError</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exception base class for zen::Xml. <a href="structzen_1_1_xml_error.html#details">More...</a><br/></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzen_1_1_xml_file_error.html">XmlFileError</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exception thrown due to failed file I/O. <a href="structzen_1_1_xml_file_error.html#details">More...</a><br/></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzen_1_1_xml_parsing_error.html">XmlParsingError</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exception thrown due to an XML parsing error. <a href="structzen_1_1_xml_parsing_error.html#details">More...</a><br/></td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a900c1fb290f0eedc24354c487145dbee"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a900c1fb290f0eedc24354c487145dbee"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee">load</a> (const String &amp;filename, <a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;doc)</td></tr>
+<tr class="memdesc:a900c1fb290f0eedc24354c487145dbee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Load XML document from a file. <a href="#a900c1fb290f0eedc24354c487145dbee"></a><br/></td></tr>
+<tr class="memitem:adeeb6b2318097382ae47aa939fc15d4d"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:adeeb6b2318097382ae47aa939fc15d4d"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d">save</a> (const <a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;doc, const String &amp;filename, const std::string &amp;lineBreak=&quot;\r\n&quot;, const std::string &amp;indent=&quot; &quot;)</td></tr>
+<tr class="memdesc:adeeb6b2318097382ae47aa939fc15d4d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Save XML document to a file. <a href="#adeeb6b2318097382ae47aa939fc15d4d"></a><br/></td></tr>
+<tr class="memitem:a2bdcecfe7435ef11cedbce47d4e72ee1"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:a2bdcecfe7435ef11cedbce47d4e72ee1"><td class="memTemplItemLeft" align="right" valign="top">bool&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1">readStruc</a> (const <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;input, T &amp;value)</td></tr>
+<tr class="memdesc:a2bdcecfe7435ef11cedbce47d4e72ee1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert XML element to structured user data. <a href="#a2bdcecfe7435ef11cedbce47d4e72ee1"></a><br/></td></tr>
+<tr class="memitem:a29ddb823fe0a195f19a64448881b8bf6"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:a29ddb823fe0a195f19a64448881b8bf6"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6">writeStruc</a> (const T &amp;value, <a class="el" href="classzen_1_1_xml_element.html">XmlElement</a> &amp;output)</td></tr>
+<tr class="memdesc:a29ddb823fe0a195f19a64448881b8bf6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert structured user data into an XML element. <a href="#a29ddb823fe0a195f19a64448881b8bf6"></a><br/></td></tr>
+<tr class="memitem:acaf85ab94b61882f957afcd355386bff"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:acaf85ab94b61882f957afcd355386bff"><td class="memTemplItemLeft" align="right" valign="top">bool&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff">readText</a> (const std::string &amp;input, T &amp;value)</td></tr>
+<tr class="memdesc:acaf85ab94b61882f957afcd355386bff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert text to user data - used by XML elements and attributes. <a href="#acaf85ab94b61882f957afcd355386bff"></a><br/></td></tr>
+<tr class="memitem:a2ce2998296871fc2f4718ceceb22a23f"><td class="memTemplParams" colspan="2">template&lt;class T &gt; </td></tr>
+<tr class="memitem:a2ce2998296871fc2f4718ceceb22a23f"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f">writeText</a> (const T &amp;value, std::string &amp;output)</td></tr>
+<tr class="memdesc:a2ce2998296871fc2f4718ceceb22a23f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert user data into text - used by XML elements and attributes. <a href="#a2ce2998296871fc2f4718ceceb22a23f"></a><br/></td></tr>
+<tr class="memitem:a4ba7bbaa14a787b07fc13da9145aabe2"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a4ba7bbaa14a787b07fc13da9145aabe2"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2">saveStream</a> (const std::string &amp;stream, const String &amp;filename)</td></tr>
+<tr class="memdesc:a4ba7bbaa14a787b07fc13da9145aabe2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Save byte stream to a file. <a href="#a4ba7bbaa14a787b07fc13da9145aabe2"></a><br/></td></tr>
+<tr class="memitem:a04fe23c3bd9b7d03309620b5ea763607"><td class="memTemplParams" colspan="2">template&lt;class String &gt; </td></tr>
+<tr class="memitem:a04fe23c3bd9b7d03309620b5ea763607"><td class="memTemplItemLeft" align="right" valign="top">std::string&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607">loadStream</a> (const String &amp;filename)</td></tr>
+<tr class="memdesc:a04fe23c3bd9b7d03309620b5ea763607"><td class="mdescLeft">&#160;</td><td class="mdescRight">Load byte stream from a file. <a href="#a04fe23c3bd9b7d03309620b5ea763607"></a><br/></td></tr>
+<tr class="memitem:afaa4920e275078e6c8009fbdf58b57ee"><td class="memItemLeft" align="right" valign="top">std::string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee">serialize</a> (const <a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;doc, const std::string &amp;lineBreak=&quot;\r\n&quot;, const std::string &amp;indent=&quot; &quot;)</td></tr>
+<tr class="memdesc:afaa4920e275078e6c8009fbdf58b57ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Save XML document as a byte stream. <a href="#afaa4920e275078e6c8009fbdf58b57ee"></a><br/></td></tr>
+<tr class="memitem:a6cf1ec0b57fc1ae9aa95761800e67ec7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7">parse</a> (const std::string &amp;stream, <a class="el" href="classzen_1_1_xml_doc.html">XmlDoc</a> &amp;doc)</td></tr>
+<tr class="memdesc:a6cf1ec0b57fc1ae9aa95761800e67ec7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Load XML document from a byte stream. <a href="#a6cf1ec0b57fc1ae9aa95761800e67ec7"></a><br/></td></tr>
+</table>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>The zen::Xml namespace. </p>
+</div><hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a900c1fb290f0eedc24354c487145dbee"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="namespacezen.html#a900c1fb290f0eedc24354c487145dbee">zen::load</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">XmlDoc &amp;&#160;</td>
+ <td class="paramname"><em>doc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Load XML document from a file. </p>
+<p>Convenience function that does nothing more than calling <a class="el" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607" title="Load byte stream from a file.">loadStream()</a> and <a class="el" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7" title="Load XML document from a byte stream.">parse()</a>.</p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">filename</td><td>Input file name </td></tr>
+ <tr><td class="paramname">doc</td><td>The XML document to load </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="exception"><dt><b>Exceptions:</b></dt><dd>
+ <table class="exception">
+ <tr><td class="paramname"><a class="el" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a></td><td></td></tr>
+ <tr><td class="paramname"><a class="el" href="structzen_1_1_xml_parsing_error.html" title="Exception thrown due to an XML parsing error.">XmlParsingError</a></td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a04fe23c3bd9b7d03309620b5ea763607"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">std::string <a class="el" href="namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607">zen::loadStream</a> </td>
+ <td>(</td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Load byte stream from a file. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">filename</td><td>Input file name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>Output byte stream </dd></dl>
+<dl class="exception"><dt><b>Exceptions:</b></dt><dd>
+ <table class="exception">
+ <tr><td class="paramname"><a class="el" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a></td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a6cf1ec0b57fc1ae9aa95761800e67ec7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7">zen::parse</a> </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>stream</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">XmlDoc &amp;&#160;</td>
+ <td class="paramname"><em>doc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Load XML document from a byte stream. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">stream</td><td>Input byte stream </td></tr>
+ <tr><td class="paramname">doc</td><td>Output XML document </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="exception"><dt><b>Exceptions:</b></dt><dd>
+ <table class="exception">
+ <tr><td class="paramname"><a class="el" href="structzen_1_1_xml_parsing_error.html" title="Exception thrown due to an XML parsing error.">XmlParsingError</a></td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a2bdcecfe7435ef11cedbce47d4e72ee1"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1">zen::readStruc</a> </td>
+ <td>(</td>
+ <td class="paramtype">const XmlElement &amp;&#160;</td>
+ <td class="paramname"><em>input</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Convert XML element to structured user data. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">input</td><td>The input XML element. </td></tr>
+ <tr><td class="paramname">value</td><td>Conversion target value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>"true" if value was read successfully. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="acaf85ab94b61882f957afcd355386bff"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">bool <a class="el" href="namespacezen.html#acaf85ab94b61882f957afcd355386bff">zen::readText</a> </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>input</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Convert text to user data - used by XML elements and attributes. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">input</td><td>Input text. </td></tr>
+ <tr><td class="paramname">value</td><td>Conversion target value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>"true" if value was read successfully. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="adeeb6b2318097382ae47aa939fc15d4d"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d">zen::save</a> </td>
+ <td>(</td>
+ <td class="paramtype">const XmlDoc &amp;&#160;</td>
+ <td class="paramname"><em>doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>lineBreak</em> = <code>&quot;\r\n&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>indent</em> = <code>&quot;&#160;&#160;&#160;&#160;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Save XML document to a file. </p>
+<p>Convenience function that does nothing more than calling <a class="el" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize()</a> and <a class="el" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2" title="Save byte stream to a file.">saveStream()</a>.</p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">doc</td><td>The XML document to save </td></tr>
+ <tr><td class="paramname">filename</td><td>Output file name </td></tr>
+ <tr><td class="paramname">lineBreak</td><td>Line break, default: carriage return + new line </td></tr>
+ <tr><td class="paramname">indent</td><td>Indentation, default: four space characters </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="exception"><dt><b>Exceptions:</b></dt><dd>
+ <table class="exception">
+ <tr><td class="paramname"><a class="el" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a></td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a4ba7bbaa14a787b07fc13da9145aabe2"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class String &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2">zen::saveStream</a> </td>
+ <td>(</td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>stream</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const String &amp;&#160;</td>
+ <td class="paramname"><em>filename</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Save byte stream to a file. </p>
+<dl class=""><dt><b>Template Parameters:</b></dt><dd>
+ <table class="">
+ <tr><td class="paramname">String</td><td>Arbitrary string-like type: e.g. std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ... </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">stream</td><td>Input byte stream </td></tr>
+ <tr><td class="paramname">filename</td><td>Output file name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="exception"><dt><b>Exceptions:</b></dt><dd>
+ <table class="exception">
+ <tr><td class="paramname"><a class="el" href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O.">XmlFileError</a></td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="afaa4920e275078e6c8009fbdf58b57ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::string <a class="el" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee">zen::serialize</a> </td>
+ <td>(</td>
+ <td class="paramtype">const XmlDoc &amp;&#160;</td>
+ <td class="paramname"><em>doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>lineBreak</em> = <code>&quot;\r\n&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const std::string &amp;&#160;</td>
+ <td class="paramname"><em>indent</em> = <code>&quot;&#160;&#160;&#160;&#160;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Save XML document as a byte stream. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">doc</td><td>Input XML document </td></tr>
+ <tr><td class="paramname">lineBreak</td><td>Line break, default: carriage return + new line </td></tr>
+ <tr><td class="paramname">indent</td><td>Indentation, default: four space characters </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns:</dt><dd>Output byte stream </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a29ddb823fe0a195f19a64448881b8bf6"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6">zen::writeStruc</a> </td>
+ <td>(</td>
+ <td class="paramtype">const T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">XmlElement &amp;&#160;</td>
+ <td class="paramname"><em>output</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Convert structured user data into an XML element. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">value</td><td>The value to be converted. </td></tr>
+ <tr><td class="paramname">output</td><td>The output XML element. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a2ce2998296871fc2f4718ceceb22a23f"></a>
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;class T &gt; </div>
+ <table class="memname">
+ <tr>
+ <td class="memname">void <a class="el" href="namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f">zen::writeText</a> </td>
+ <td>(</td>
+ <td class="paramtype">const T &amp;&#160;</td>
+ <td class="paramname"><em>value</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">std::string &amp;&#160;</td>
+ <td class="paramname"><em>output</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>Convert user data into text - used by XML elements and attributes. </p>
+<dl class="params"><dt><b>Parameters:</b></dt><dd>
+ <table class="params">
+ <tr><td class="paramname">value</td><td>The value to be converted. </td></tr>
+ <tr><td class="paramname">output</td><td>Output text. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/nav_f.png b/zenxml/doc/nav_f.png
new file mode 100644
index 00000000..1b07a162
--- /dev/null
+++ b/zenxml/doc/nav_f.png
Binary files differ
diff --git a/zenxml/doc/nav_h.png b/zenxml/doc/nav_h.png
new file mode 100644
index 00000000..01f5fa6a
--- /dev/null
+++ b/zenxml/doc/nav_h.png
Binary files differ
diff --git a/zenxml/doc/open.png b/zenxml/doc/open.png
new file mode 100644
index 00000000..7b35d2c2
--- /dev/null
+++ b/zenxml/doc/open.png
Binary files differ
diff --git a/zenxml/doc/parser_8h_source.html b/zenxml/doc/parser_8h_source.html
new file mode 100644
index 00000000..97bdc7e3
--- /dev/null
+++ b/zenxml/doc/parser_8h_source.html
@@ -0,0 +1,687 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: parser.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">parser.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_PARSER_HEADER_81248670213764583021432</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_PARSER_HEADER_81248670213764583021432</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;cstdio&gt;</span>
+<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;cstddef&gt;</span> <span class="comment">//ptrdiff_t; req. on Linux</span>
+<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;zen/string_traits.h&gt;</span>
+<a name="l00013"></a>00013 <span class="preprocessor">#include &quot;dom.h&quot;</span>
+<a name="l00014"></a>00014 <span class="preprocessor">#include &quot;error.h&quot;</span>
+<a name="l00015"></a>00015
+<a name="l00016"></a>00016 <span class="keyword">namespace </span>zen
+<a name="l00017"></a>00017 {
+<a name="l00023"></a>00023
+<a name="l00024"></a>00024
+<a name="l00030"></a>00030 std::string <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(<span class="keyword">const</span> XmlDoc&amp; doc,
+<a name="l00031"></a>00031 <span class="keyword">const</span> std::string&amp; lineBreak = <span class="stringliteral">&quot;\r\n&quot;</span>,
+<a name="l00032"></a>00032 <span class="keyword">const</span> std::string&amp; indent = <span class="stringliteral">&quot; &quot;</span>); <span class="comment">//throw ()</span>
+<a name="l00033"></a>00033
+<a name="l00035"></a><a class="code" href="structzen_1_1_xml_parsing_error.html">00035</a> <span class="keyword">struct </span><a class="code" href="structzen_1_1_xml_parsing_error.html" title="Exception thrown due to an XML parsing error.">XmlParsingError</a> : <span class="keyword">public</span> <a class="code" href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml.">XmlError</a>
+<a name="l00036"></a>00036 {
+<a name="l00037"></a>00037 <a class="code" href="structzen_1_1_xml_parsing_error.html" title="Exception thrown due to an XML parsing error.">XmlParsingError</a>(<span class="keywordtype">size_t</span> rowNo, <span class="keywordtype">size_t</span> colNo) : <a class="code" href="structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e" title="Input file row where the parsing error occured (zero-based)">row</a>(rowNo), <a class="code" href="structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd" title="Input file column where the parsing error occured (zero-based)">col</a>(colNo) {}
+<a name="l00039"></a><a class="code" href="structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e">00039</a> <span class="keywordtype">size_t</span> <a class="code" href="structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e" title="Input file row where the parsing error occured (zero-based)">row</a>; <span class="comment">//beginning with 0</span>
+<a name="l00041"></a><a class="code" href="structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd">00041</a> <span class="comment"></span> <span class="keywordtype">size_t</span> <a class="code" href="structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd" title="Input file column where the parsing error occured (zero-based)">col</a>; <span class="comment">//</span>
+<a name="l00042"></a>00042 };
+<a name="l00043"></a>00043
+<a name="l00044"></a>00044
+<a name="l00046"></a>00046
+<a name="l00051"></a>00051 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7" title="Load XML document from a byte stream.">parse</a>(<span class="keyword">const</span> std::string&amp; stream, <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; doc); <span class="comment">//throw XmlParsingError</span>
+<a name="l00052"></a>00052
+<a name="l00053"></a>00053
+<a name="l00054"></a>00054
+<a name="l00055"></a>00055
+<a name="l00056"></a>00056
+<a name="l00057"></a>00057
+<a name="l00058"></a>00058
+<a name="l00059"></a>00059
+<a name="l00060"></a>00060
+<a name="l00061"></a>00061
+<a name="l00062"></a>00062
+<a name="l00063"></a>00063
+<a name="l00064"></a>00064
+<a name="l00065"></a>00065
+<a name="l00066"></a>00066
+<a name="l00067"></a>00067
+<a name="l00068"></a>00068
+<a name="l00069"></a>00069
+<a name="l00070"></a>00070
+<a name="l00071"></a>00071
+<a name="l00072"></a>00072 <span class="comment">//---------------------------- implementation ----------------------------</span>
+<a name="l00073"></a>00073 <span class="comment">//see: http://www.w3.org/TR/xml/</span>
+<a name="l00074"></a>00074
+<a name="l00075"></a>00075 <span class="keyword">namespace </span>implementation
+<a name="l00076"></a>00076 {
+<a name="l00077"></a>00077 <span class="keyword">inline</span>
+<a name="l00078"></a>00078 std::pair&lt;char, char&gt; hexify(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c)
+<a name="l00079"></a>00079 {
+<a name="l00080"></a>00080 <span class="keyword">auto</span> hexifyDigit = [](<span class="keywordtype">int</span> num) -&gt; <span class="keywordtype">char</span> <span class="comment">//input [0, 15], output 0-9, A-F</span>
+<a name="l00081"></a>00081 {
+<a name="l00082"></a>00082 assert(0 &lt;= num&amp;&amp; num &lt;= 15); <span class="comment">//guaranteed by design below!</span>
+<a name="l00083"></a>00083 <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">char</span><span class="keyword">&gt;</span>(num &lt;= 9 ? <span class="comment">//no signed/unsigned char problem here!</span>
+<a name="l00084"></a>00084 <span class="charliteral">&#39;0&#39;</span> + num :
+<a name="l00085"></a>00085 <span class="charliteral">&#39;A&#39;</span> + (num - 10));
+<a name="l00086"></a>00086 };
+<a name="l00087"></a>00087 <span class="keywordflow">return</span> std::make_pair(hexifyDigit(c / 16), hexifyDigit(c % 16));
+<a name="l00088"></a>00088 }
+<a name="l00089"></a>00089
+<a name="l00090"></a>00090
+<a name="l00091"></a>00091 <span class="keyword">inline</span>
+<a name="l00092"></a>00092 <span class="keywordtype">char</span> unhexify(<span class="keywordtype">char</span> high, <span class="keywordtype">char</span> low)
+<a name="l00093"></a>00093 {
+<a name="l00094"></a>00094 <span class="keyword">auto</span> unhexifyDigit = [](<span class="keywordtype">char</span> hex) -&gt; <span class="keywordtype">int</span> <span class="comment">//input 0-9, a-f, A-F; output range: [0, 15]</span>
+<a name="l00095"></a>00095 {
+<a name="l00096"></a>00096 <span class="keywordflow">if</span> (<span class="charliteral">&#39;0&#39;</span> &lt;= hex &amp;&amp; hex &lt;= <span class="charliteral">&#39;9&#39;</span>) <span class="comment">//no signed/unsigned char problem here!</span>
+<a name="l00097"></a>00097 <span class="keywordflow">return</span> hex - <span class="charliteral">&#39;0&#39;</span>;
+<a name="l00098"></a>00098 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="charliteral">&#39;A&#39;</span> &lt;= hex &amp;&amp; hex &lt;= <span class="charliteral">&#39;F&#39;</span>)
+<a name="l00099"></a>00099 <span class="keywordflow">return</span> (hex - <span class="charliteral">&#39;A&#39;</span>) + 10;
+<a name="l00100"></a>00100 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="charliteral">&#39;a&#39;</span> &lt;= hex &amp;&amp; hex &lt;= <span class="charliteral">&#39;f&#39;</span>)
+<a name="l00101"></a>00101 <span class="keywordflow">return</span> (hex - <span class="charliteral">&#39;a&#39;</span>) + 10;
+<a name="l00102"></a>00102 assert(<span class="keyword">false</span>);
+<a name="l00103"></a>00103 <span class="keywordflow">return</span> 0;
+<a name="l00104"></a>00104 };
+<a name="l00105"></a>00105 <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(16 * unhexifyDigit(high) + unhexifyDigit(low)); <span class="comment">//[!] convert to unsigned char first, then to char (which may be signed)</span>
+<a name="l00106"></a>00106 };
+<a name="l00107"></a>00107
+<a name="l00108"></a>00108
+<a name="l00109"></a>00109 <span class="keyword">template</span> &lt;<span class="keyword">class</span> Predicate&gt; <span class="keyword">inline</span>
+<a name="l00110"></a>00110 std::string normalize(<span class="keyword">const</span> std::string&amp; str, Predicate pred) <span class="comment">//pred: unary function taking a char, return true if value shall be encoded as hex</span>
+<a name="l00111"></a>00111 {
+<a name="l00112"></a>00112 std::string output;
+<a name="l00113"></a>00113 std::for_each(str.begin(), str.end(),
+<a name="l00114"></a>00114 [&amp;](<span class="keywordtype">char</span> c)
+<a name="l00115"></a>00115 {
+<a name="l00116"></a>00116 <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;&amp;&#39;</span>) <span class="comment">//</span>
+<a name="l00117"></a>00117 output += <span class="stringliteral">&quot;&amp;amp;&quot;</span>;
+<a name="l00118"></a>00118 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;&lt;&#39;</span>) <span class="comment">//normalization mandatory: http://www.w3.org/TR/xml/#syntax</span>
+<a name="l00119"></a>00119 output += <span class="stringliteral">&quot;&amp;lt;&quot;</span>;
+<a name="l00120"></a>00120 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;&gt;&#39;</span>) <span class="comment">//</span>
+<a name="l00121"></a>00121 output += <span class="stringliteral">&quot;&amp;gt;&quot;</span>;
+<a name="l00122"></a>00122 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pred(c))
+<a name="l00123"></a>00123 {
+<a name="l00124"></a>00124 <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;\&#39;&#39;</span>)
+<a name="l00125"></a>00125 output += <span class="stringliteral">&quot;&amp;apos;&quot;</span>;
+<a name="l00126"></a>00126 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;\&quot;&#39;</span>)
+<a name="l00127"></a>00127 output += <span class="stringliteral">&quot;&amp;quot;&quot;</span>;
+<a name="l00128"></a>00128 <span class="keywordflow">else</span>
+<a name="l00129"></a>00129 {
+<a name="l00130"></a>00130 output += <span class="stringliteral">&quot;&amp;#x&quot;</span>;
+<a name="l00131"></a>00131 <span class="keyword">const</span> <span class="keyword">auto</span> hexDigits = hexify(c); <span class="comment">//hexify beats &quot;printNumber&lt;std::string&gt;(&quot;&amp;#x%02X;&quot;, c)&quot; by a nice factor of 3!</span>
+<a name="l00132"></a>00132 output += hexDigits.first;
+<a name="l00133"></a>00133 output += hexDigits.second;
+<a name="l00134"></a>00134 output += <span class="charliteral">&#39;;&#39;</span>;
+<a name="l00135"></a>00135 }
+<a name="l00136"></a>00136 }
+<a name="l00137"></a>00137 <span class="keywordflow">else</span>
+<a name="l00138"></a>00138 output += c;
+<a name="l00139"></a>00139 });
+<a name="l00140"></a>00140 <span class="keywordflow">return</span> output;
+<a name="l00141"></a>00141 }
+<a name="l00142"></a>00142
+<a name="l00143"></a>00143 <span class="keyword">inline</span>
+<a name="l00144"></a>00144 std::string normalizeName(<span class="keyword">const</span> std::string&amp; str)
+<a name="l00145"></a>00145 {
+<a name="l00146"></a>00146 <span class="keywordflow">return</span> normalize(str, [](<span class="keywordtype">char</span> c) { <span class="keywordflow">return</span> isWhiteSpace(c) || c == <span class="charliteral">&#39;=&#39;</span> || c == <span class="charliteral">&#39;/&#39;</span> || c == <span class="charliteral">&#39;\&#39;&#39;</span> || c == <span class="charliteral">&#39;\&quot;&#39;</span>; });
+<a name="l00147"></a>00147 }
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149 <span class="keyword">inline</span>
+<a name="l00150"></a>00150 std::string normalizeElementValue(<span class="keyword">const</span> std::string&amp; str)
+<a name="l00151"></a>00151 {
+<a name="l00152"></a>00152 <span class="keywordflow">return</span> normalize(str, [](<span class="keywordtype">char</span> c) { <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(c) &lt; 32; });
+<a name="l00153"></a>00153 }
+<a name="l00154"></a>00154
+<a name="l00155"></a>00155 <span class="keyword">inline</span>
+<a name="l00156"></a>00156 std::string normalizeAttribValue(<span class="keyword">const</span> std::string&amp; str)
+<a name="l00157"></a>00157 {
+<a name="l00158"></a>00158 <span class="keywordflow">return</span> normalize(str, [](<span class="keywordtype">char</span> c) { <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span><span class="keyword">&gt;</span>(c) &lt; 32 || c == <span class="charliteral">&#39;\&#39;&#39;</span> || c == <span class="charliteral">&#39;\&quot;&#39;</span>; });
+<a name="l00159"></a>00159 }
+<a name="l00160"></a>00160
+<a name="l00161"></a>00161
+<a name="l00162"></a>00162 <span class="keyword">template</span> &lt;<span class="keyword">class</span> CharIterator, <span class="keywordtype">size_t</span> N&gt; <span class="keyword">inline</span>
+<a name="l00163"></a>00163 <span class="keywordtype">bool</span> checkEntity(CharIterator&amp; first, CharIterator last, <span class="keyword">const</span> <span class="keywordtype">char</span> (&amp;placeholder)[N])
+<a name="l00164"></a>00164 {
+<a name="l00165"></a>00165 assert(placeholder[N - 1] == 0);
+<a name="l00166"></a>00166 <span class="keyword">const</span> ptrdiff_t strLen = N - 1; <span class="comment">//don&#39;t count null-terminator</span>
+<a name="l00167"></a>00167 <span class="keywordflow">if</span> (last - first &gt;= strLen &amp;&amp; std::equal(first, first + strLen, placeholder))
+<a name="l00168"></a>00168 {
+<a name="l00169"></a>00169 first += strLen - 1;
+<a name="l00170"></a>00170 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00171"></a>00171 }
+<a name="l00172"></a>00172 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00173"></a>00173 }
+<a name="l00174"></a>00174
+<a name="l00175"></a>00175
+<a name="l00176"></a>00176 <span class="keyword">namespace</span>
+<a name="l00177"></a>00177 {
+<a name="l00178"></a>00178 std::string denormalize(<span class="keyword">const</span> std::string&amp; str)
+<a name="l00179"></a>00179 {
+<a name="l00180"></a>00180 std::string output;
+<a name="l00181"></a>00181 <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = str.begin(); it != str.end(); ++it)
+<a name="l00182"></a>00182 {
+<a name="l00183"></a>00183 <span class="keyword">const</span> <span class="keywordtype">char</span> c = *it;
+<a name="l00184"></a>00184
+<a name="l00185"></a>00185 <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;&amp;&#39;</span>)
+<a name="l00186"></a>00186 {
+<a name="l00187"></a>00187 <span class="keywordflow">if</span> (checkEntity(it, str.end(), <span class="stringliteral">&quot;&amp;amp;&quot;</span>))
+<a name="l00188"></a>00188 output += <span class="charliteral">&#39;&amp;&#39;</span>;
+<a name="l00189"></a>00189 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (checkEntity(it, str.end(), <span class="stringliteral">&quot;&amp;lt;&quot;</span>))
+<a name="l00190"></a>00190 output += <span class="charliteral">&#39;&lt;&#39;</span>;
+<a name="l00191"></a>00191 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (checkEntity(it, str.end(), <span class="stringliteral">&quot;&amp;gt;&quot;</span>))
+<a name="l00192"></a>00192 output += <span class="charliteral">&#39;&gt;&#39;</span>;
+<a name="l00193"></a>00193 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (checkEntity(it, str.end(), <span class="stringliteral">&quot;&amp;apos;&quot;</span>))
+<a name="l00194"></a>00194 output += <span class="charliteral">&#39;\&#39;&#39;</span>;
+<a name="l00195"></a>00195 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (checkEntity(it, str.end(), <span class="stringliteral">&quot;&amp;quot;&quot;</span>))
+<a name="l00196"></a>00196 output += <span class="charliteral">&#39;\&quot;&#39;</span>;
+<a name="l00197"></a>00197 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (str.end() - it &gt;= 6 &amp;&amp;
+<a name="l00198"></a>00198 it[1] == <span class="charliteral">&#39;#&#39;</span> &amp;&amp;
+<a name="l00199"></a>00199 it[2] == <span class="charliteral">&#39;x&#39;</span> &amp;&amp;
+<a name="l00200"></a>00200 it[5] == <span class="charliteral">&#39;;&#39;</span>)
+<a name="l00201"></a>00201 {
+<a name="l00202"></a>00202 output += unhexify(it[3], it[4]); <span class="comment">//unhexify beats &quot;::sscanf(&amp;it[3], &quot;%02X&quot;, &amp;tmp)&quot; by a factor of 3000 for ~250000 calls!!!</span>
+<a name="l00203"></a>00203 it += 5;
+<a name="l00204"></a>00204 }
+<a name="l00205"></a>00205 <span class="keywordflow">else</span>
+<a name="l00206"></a>00206 output += c; <span class="comment">//unexpected char!</span>
+<a name="l00207"></a>00207 }
+<a name="l00208"></a>00208 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;\r&#39;</span>) <span class="comment">//map all end-of-line characters to \n http://www.w3.org/TR/xml/#sec-line-ends</span>
+<a name="l00209"></a>00209 {
+<a name="l00210"></a>00210 <span class="keyword">auto</span> itNext = it + 1;
+<a name="l00211"></a>00211 <span class="keywordflow">if</span> (itNext != str.end() &amp;&amp; *itNext == <span class="charliteral">&#39;\n&#39;</span>)
+<a name="l00212"></a>00212 ++it;
+<a name="l00213"></a>00213 output += <span class="charliteral">&#39;\n&#39;</span>;
+<a name="l00214"></a>00214 }
+<a name="l00215"></a>00215 <span class="keywordflow">else</span>
+<a name="l00216"></a>00216 output += c;
+<a name="l00217"></a>00217 };
+<a name="l00218"></a>00218 <span class="keywordflow">return</span> output;
+<a name="l00219"></a>00219 }
+<a name="l00220"></a>00220
+<a name="l00221"></a>00221
+<a name="l00222"></a>00222 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(<span class="keyword">const</span> XmlElement&amp; element, std::string&amp; stream,
+<a name="l00223"></a>00223 <span class="keyword">const</span> std::string&amp; lineBreak,
+<a name="l00224"></a>00224 <span class="keyword">const</span> std::string&amp; indent,
+<a name="l00225"></a>00225 <span class="keywordtype">size_t</span> indentLevel)
+<a name="l00226"></a>00226 {
+<a name="l00227"></a>00227 <span class="keyword">const</span> std::string&amp; nameFmt = normalizeName(element.getNameAs&lt;std::string&gt;());
+<a name="l00228"></a>00228
+<a name="l00229"></a>00229 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; indentLevel; ++i)
+<a name="l00230"></a>00230 stream += indent;
+<a name="l00231"></a>00231
+<a name="l00232"></a>00232 stream += <span class="charliteral">&#39;&lt;&#39;</span> + nameFmt;
+<a name="l00233"></a>00233
+<a name="l00234"></a>00234 <span class="keyword">auto</span> attr = element.getAttributes();
+<a name="l00235"></a>00235 <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = attr.first; it != attr.second; ++it)
+<a name="l00236"></a>00236 stream += <span class="charliteral">&#39; &#39;</span> + normalizeName(it-&gt;first) + <span class="stringliteral">&quot;=\&quot;&quot;</span> + normalizeAttribValue(it-&gt;second) + <span class="charliteral">&#39;\&quot;&#39;</span>;
+<a name="l00237"></a>00237
+<a name="l00238"></a>00238 <span class="comment">//no support for mixed-mode content</span>
+<a name="l00239"></a>00239 <span class="keyword">auto</span> iterPair = element.getChildren();
+<a name="l00240"></a>00240 <span class="keywordflow">if</span> (iterPair.first != iterPair.second) <span class="comment">//structured element</span>
+<a name="l00241"></a>00241 {
+<a name="l00242"></a>00242 stream += <span class="charliteral">&#39;&gt;&#39;</span> + lineBreak;
+<a name="l00243"></a>00243
+<a name="l00244"></a>00244 std::for_each(iterPair.first, iterPair.second,
+<a name="l00245"></a>00245 [&amp;](<span class="keyword">const</span> XmlElement &amp; el) { <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(el, stream, lineBreak, indent, indentLevel + 1); });
+<a name="l00246"></a>00246
+<a name="l00247"></a>00247 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; indentLevel; ++i)
+<a name="l00248"></a>00248 stream += indent;
+<a name="l00249"></a>00249 stream += <span class="stringliteral">&quot;&lt;/&quot;</span> + nameFmt + <span class="charliteral">&#39;&gt;&#39;</span> + lineBreak;
+<a name="l00250"></a>00250 }
+<a name="l00251"></a>00251 <span class="keywordflow">else</span>
+<a name="l00252"></a>00252 {
+<a name="l00253"></a>00253 std::string value;
+<a name="l00254"></a>00254 element.getValue(value);
+<a name="l00255"></a>00255
+<a name="l00256"></a>00256 <span class="keywordflow">if</span> (!value.empty()) <span class="comment">//value element</span>
+<a name="l00257"></a>00257 stream += <span class="charliteral">&#39;&gt;&#39;</span> + normalizeElementValue(value) + <span class="stringliteral">&quot;&lt;/&quot;</span> + nameFmt + <span class="charliteral">&#39;&gt;&#39;</span> + lineBreak;
+<a name="l00258"></a>00258 <span class="keywordflow">else</span> <span class="comment">//empty element</span>
+<a name="l00259"></a>00259 stream += <span class="stringliteral">&quot;/&gt;&quot;</span> + lineBreak;
+<a name="l00260"></a>00260 }
+<a name="l00261"></a>00261 }
+<a name="l00262"></a>00262
+<a name="l00263"></a>00263 std::string <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(<span class="keyword">const</span> XmlDoc&amp; doc,
+<a name="l00264"></a>00264 <span class="keyword">const</span> std::string&amp; lineBreak,
+<a name="l00265"></a>00265 <span class="keyword">const</span> std::string&amp; indent)
+<a name="l00266"></a>00266 {
+<a name="l00267"></a>00267 std::string version = doc.getVersionAs&lt;std::string&gt;();
+<a name="l00268"></a>00268 <span class="keywordflow">if</span> (!version.empty())
+<a name="l00269"></a>00269 version = <span class="stringliteral">&quot; version=\&quot;&quot;</span> + normalizeAttribValue(version) + <span class="charliteral">&#39;\&quot;&#39;</span>;
+<a name="l00270"></a>00270
+<a name="l00271"></a>00271 std::string encoding = doc.getEncodingAs&lt;std::string&gt;();
+<a name="l00272"></a>00272 <span class="keywordflow">if</span> (!encoding.empty())
+<a name="l00273"></a>00273 encoding = <span class="stringliteral">&quot; encoding=\&quot;&quot;</span> + normalizeAttribValue(encoding) + <span class="charliteral">&#39;\&quot;&#39;</span>;
+<a name="l00274"></a>00274
+<a name="l00275"></a>00275 std::string standalone = doc.getStandaloneAs&lt;std::string&gt;();
+<a name="l00276"></a>00276 <span class="keywordflow">if</span> (!standalone.empty())
+<a name="l00277"></a>00277 standalone = <span class="stringliteral">&quot; standalone=\&quot;&quot;</span> + normalizeAttribValue(standalone) + <span class="charliteral">&#39;\&quot;&#39;</span>;
+<a name="l00278"></a>00278
+<a name="l00279"></a>00279 std::string output = <span class="stringliteral">&quot;&lt;?xml&quot;</span> + version + encoding + standalone + <span class="stringliteral">&quot;?&gt;&quot;</span> + lineBreak;
+<a name="l00280"></a>00280 <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(doc.root(), output, lineBreak, indent, 0);
+<a name="l00281"></a>00281 <span class="keywordflow">return</span> output;
+<a name="l00282"></a>00282 }
+<a name="l00283"></a>00283 }
+<a name="l00284"></a>00284 }
+<a name="l00285"></a>00285
+<a name="l00286"></a>00286 <span class="keyword">inline</span>
+<a name="l00287"></a><a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee">00287</a> std::string <a class="code" href="namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee" title="Save XML document as a byte stream.">serialize</a>(<span class="keyword">const</span> <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; doc,
+<a name="l00288"></a>00288 <span class="keyword">const</span> std::string&amp; lineBreak,
+<a name="l00289"></a>00289 <span class="keyword">const</span> std::string&amp; indent) { <span class="keywordflow">return</span> implementation::serialize(doc, lineBreak, indent); }
+<a name="l00290"></a>00290
+<a name="l00291"></a>00291 <span class="comment">/*</span>
+<a name="l00292"></a>00292 <span class="comment">Grammar for XML parser</span>
+<a name="l00293"></a>00293 <span class="comment">-------------------------------</span>
+<a name="l00294"></a>00294 <span class="comment">document-expression:</span>
+<a name="l00295"></a>00295 <span class="comment"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;</span>
+<a name="l00296"></a>00296 <span class="comment"> element-expression:</span>
+<a name="l00297"></a>00297 <span class="comment"></span>
+<a name="l00298"></a>00298 <span class="comment">element-expression:</span>
+<a name="l00299"></a>00299 <span class="comment"> &lt;string attributes-expression/&gt;</span>
+<a name="l00300"></a>00300 <span class="comment"> &lt;string attributes-expression&gt; pm-expression &lt;/string&gt;</span>
+<a name="l00301"></a>00301 <span class="comment"></span>
+<a name="l00302"></a>00302 <span class="comment">element-list-expression:</span>
+<a name="l00303"></a>00303 <span class="comment"> &lt;empty&gt;</span>
+<a name="l00304"></a>00304 <span class="comment"> element-expression element-list-expression</span>
+<a name="l00305"></a>00305 <span class="comment"></span>
+<a name="l00306"></a>00306 <span class="comment">attributes-expression:</span>
+<a name="l00307"></a>00307 <span class="comment"> &lt;empty&gt;</span>
+<a name="l00308"></a>00308 <span class="comment"> string=&quot;string&quot; attributes-expression</span>
+<a name="l00309"></a>00309 <span class="comment"></span>
+<a name="l00310"></a>00310 <span class="comment">pm-expression:</span>
+<a name="l00311"></a>00311 <span class="comment"> string</span>
+<a name="l00312"></a>00312 <span class="comment"> element-list-expression</span>
+<a name="l00313"></a>00313 <span class="comment">*/</span>
+<a name="l00314"></a>00314
+<a name="l00315"></a>00315 <span class="keyword">namespace </span>implementation
+<a name="l00316"></a>00316 {
+<a name="l00317"></a>00317 <span class="keyword">struct </span>Token
+<a name="l00318"></a>00318 {
+<a name="l00319"></a>00319 <span class="keyword">enum</span> Type
+<a name="l00320"></a>00320 {
+<a name="l00321"></a>00321 TK_LESS,
+<a name="l00322"></a>00322 TK_GREATER,
+<a name="l00323"></a>00323 TK_LESS_SLASH,
+<a name="l00324"></a>00324 TK_SLASH_GREATER,
+<a name="l00325"></a>00325 TK_EQUAL,
+<a name="l00326"></a>00326 TK_QUOTE,
+<a name="l00327"></a>00327 TK_DECL_BEGIN,
+<a name="l00328"></a>00328 TK_DECL_END,
+<a name="l00329"></a>00329 TK_NAME,
+<a name="l00330"></a>00330 TK_END
+<a name="l00331"></a>00331 };
+<a name="l00332"></a>00332
+<a name="l00333"></a>00333 Token(Type t) : type(t) {}
+<a name="l00334"></a>00334 Token(<span class="keyword">const</span> std::string&amp; txt) : type(TK_NAME), name(txt) {}
+<a name="l00335"></a>00335
+<a name="l00336"></a>00336 Type type;
+<a name="l00337"></a>00337 std::string name; <span class="comment">//filled if type == TK_NAME</span>
+<a name="l00338"></a>00338 };
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 <span class="keyword">class </span>Scanner
+<a name="l00341"></a>00341 {
+<a name="l00342"></a>00342 <span class="keyword">public</span>:
+<a name="l00343"></a>00343 Scanner(<span class="keyword">const</span> std::string&amp; stream) : stream_(stream), pos(stream_.begin())
+<a name="l00344"></a>00344 {
+<a name="l00345"></a>00345 <span class="keywordflow">if</span> (zen::startsWith(stream_, BYTE_ORDER_MARK_UTF8))
+<a name="l00346"></a>00346 pos += strLength(BYTE_ORDER_MARK_UTF8);
+<a name="l00347"></a>00347
+<a name="l00348"></a>00348 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;&lt;?xml&quot;</span>, Token::TK_DECL_BEGIN));
+<a name="l00349"></a>00349 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;?&gt;&quot;</span>, Token::TK_DECL_END));
+<a name="l00350"></a>00350 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;&lt;/&quot;</span>, Token::TK_LESS_SLASH));
+<a name="l00351"></a>00351 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;/&gt;&quot;</span>, Token::TK_SLASH_GREATER));
+<a name="l00352"></a>00352 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;&lt;&quot;</span> , Token::TK_LESS)); <span class="comment">//evaluate after TK_DECL_BEGIN!</span>
+<a name="l00353"></a>00353 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;&gt;&quot;</span> , Token::TK_GREATER));
+<a name="l00354"></a>00354 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;=&quot;</span> , Token::TK_EQUAL));
+<a name="l00355"></a>00355 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;\&quot;&quot;</span>, Token::TK_QUOTE));
+<a name="l00356"></a>00356 tokens.push_back(std::make_pair(<span class="stringliteral">&quot;\&#39;&quot;</span>, Token::TK_QUOTE));
+<a name="l00357"></a>00357 }
+<a name="l00358"></a>00358
+<a name="l00359"></a>00359 Token nextToken() <span class="comment">//throw XmlParsingError</span>
+<a name="l00360"></a>00360 {
+<a name="l00361"></a>00361 <span class="comment">//skip whitespace</span>
+<a name="l00362"></a>00362 pos = std::find_if(pos, stream_.end(), [](<span class="keywordtype">char</span> c) { <span class="keywordflow">return</span> !zen::isWhiteSpace(c); });
+<a name="l00363"></a>00363
+<a name="l00364"></a>00364 <span class="keywordflow">if</span> (pos == stream_.end())
+<a name="l00365"></a>00365 <span class="keywordflow">return</span> Token::TK_END;
+<a name="l00366"></a>00366
+<a name="l00367"></a>00367 <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = tokens.begin(); it != tokens.end(); ++it)
+<a name="l00368"></a>00368 <span class="keywordflow">if</span> (startsWith(pos, it-&gt;first))
+<a name="l00369"></a>00369 {
+<a name="l00370"></a>00370 pos += it-&gt;first.size();
+<a name="l00371"></a>00371 <span class="keywordflow">return</span> it-&gt;second;
+<a name="l00372"></a>00372 }
+<a name="l00373"></a>00373
+<a name="l00374"></a>00374 <span class="keyword">auto</span> nameEnd = std::find_if(pos, stream_.end(), [](<span class="keywordtype">char</span> c)
+<a name="l00375"></a>00375 {
+<a name="l00376"></a>00376 <span class="keywordflow">return</span> c == <span class="charliteral">&#39;&lt;&#39;</span> ||
+<a name="l00377"></a>00377 c == <span class="charliteral">&#39;&gt;&#39;</span> ||
+<a name="l00378"></a>00378 c == <span class="charliteral">&#39;=&#39;</span> ||
+<a name="l00379"></a>00379 c == <span class="charliteral">&#39;/&#39;</span> ||
+<a name="l00380"></a>00380 c == <span class="charliteral">&#39;\&#39;&#39;</span> ||
+<a name="l00381"></a>00381 c == <span class="charliteral">&#39;\&quot;&#39;</span> ||
+<a name="l00382"></a>00382 zen::isWhiteSpace(c);
+<a name="l00383"></a>00383 });
+<a name="l00384"></a>00384
+<a name="l00385"></a>00385 <span class="keywordflow">if</span> (nameEnd != pos)
+<a name="l00386"></a>00386 {
+<a name="l00387"></a>00387 std::string name(&amp;*pos, nameEnd - pos);
+<a name="l00388"></a>00388 pos = nameEnd;
+<a name="l00389"></a>00389 <span class="keywordflow">return</span> implementation::denormalize(name);
+<a name="l00390"></a>00390 }
+<a name="l00391"></a>00391
+<a name="l00392"></a>00392 <span class="comment">//unknown token</span>
+<a name="l00393"></a>00393 <span class="keywordflow">throw</span> XmlParsingError(posRow(), posCol());
+<a name="l00394"></a>00394 }
+<a name="l00395"></a>00395
+<a name="l00396"></a>00396 std::string extractElementValue()
+<a name="l00397"></a>00397 {
+<a name="l00398"></a>00398 <span class="keyword">auto</span> it = std::find_if(pos, stream_.end(), [](<span class="keywordtype">char</span> c)
+<a name="l00399"></a>00399 {
+<a name="l00400"></a>00400 <span class="keywordflow">return</span> c == <span class="charliteral">&#39;&lt;&#39;</span> ||
+<a name="l00401"></a>00401 c == <span class="charliteral">&#39;&gt;&#39;</span>;
+<a name="l00402"></a>00402 });
+<a name="l00403"></a>00403 std::string output(pos, it);
+<a name="l00404"></a>00404 pos = it;
+<a name="l00405"></a>00405 <span class="keywordflow">return</span> implementation::denormalize(output);
+<a name="l00406"></a>00406 }
+<a name="l00407"></a>00407
+<a name="l00408"></a>00408 std::string extractAttributeValue()
+<a name="l00409"></a>00409 {
+<a name="l00410"></a>00410 <span class="keyword">auto</span> it = std::find_if(pos, stream_.end(), [](<span class="keywordtype">char</span> c)
+<a name="l00411"></a>00411 {
+<a name="l00412"></a>00412 <span class="keywordflow">return</span> c == <span class="charliteral">&#39;&lt;&#39;</span> ||
+<a name="l00413"></a>00413 c == <span class="charliteral">&#39;&gt;&#39;</span> ||
+<a name="l00414"></a>00414 c == <span class="charliteral">&#39;\&#39;&#39;</span> ||
+<a name="l00415"></a>00415 c == <span class="charliteral">&#39;\&quot;&#39;</span>;
+<a name="l00416"></a>00416 });
+<a name="l00417"></a>00417 std::string output(pos, it);
+<a name="l00418"></a>00418 pos = it;
+<a name="l00419"></a>00419 <span class="keywordflow">return</span> implementation::denormalize(output);
+<a name="l00420"></a>00420 }
+<a name="l00421"></a>00421
+<a name="l00422"></a>00422 <span class="keywordtype">size_t</span> posRow() const <span class="comment">//current row beginning with 0</span>
+<a name="l00423"></a>00423 {
+<a name="l00424"></a>00424 <span class="keyword">const</span> <span class="keywordtype">size_t</span> crSum = std::count(stream_.begin(), pos, <span class="charliteral">&#39;\r&#39;</span>); <span class="comment">//carriage returns</span>
+<a name="l00425"></a>00425 <span class="keyword">const</span> <span class="keywordtype">size_t</span> nlSum = std::count(stream_.begin(), pos, <span class="charliteral">&#39;\n&#39;</span>); <span class="comment">//new lines</span>
+<a name="l00426"></a>00426 assert(crSum == 0 || nlSum == 0 || crSum == nlSum);
+<a name="l00427"></a>00427 <span class="keywordflow">return</span> std::max(crSum, nlSum); <span class="comment">//be compatible with Linux/Mac/Win</span>
+<a name="l00428"></a>00428 }
+<a name="l00429"></a>00429
+<a name="l00430"></a>00430 <span class="keywordtype">size_t</span> posCol() const <span class="comment">//current col beginning with 0</span>
+<a name="l00431"></a>00431 {
+<a name="l00432"></a>00432 <span class="comment">//seek beginning of line</span>
+<a name="l00433"></a>00433 <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = pos; it != stream_.begin(); )
+<a name="l00434"></a>00434 {
+<a name="l00435"></a>00435 --it;
+<a name="l00436"></a>00436 <span class="keywordflow">if</span> (*it == <span class="charliteral">&#39;\r&#39;</span> || *it == <span class="charliteral">&#39;\n&#39;</span>)
+<a name="l00437"></a>00437 <span class="keywordflow">return</span> pos - it - 1;
+<a name="l00438"></a>00438 }
+<a name="l00439"></a>00439 <span class="keywordflow">return</span> pos - stream_.begin();
+<a name="l00440"></a>00440 }
+<a name="l00441"></a>00441
+<a name="l00442"></a>00442 <span class="keyword">private</span>:
+<a name="l00443"></a>00443 Scanner(<span class="keyword">const</span> Scanner&amp;);
+<a name="l00444"></a>00444 Scanner&amp; operator=(<span class="keyword">const</span> Scanner&amp;);
+<a name="l00445"></a>00445
+<a name="l00446"></a>00446 <span class="keywordtype">bool</span> startsWith(std::string::const_iterator it, <span class="keyword">const</span> std::string&amp; prefix)<span class="keyword"> const</span>
+<a name="l00447"></a>00447 <span class="keyword"> </span>{
+<a name="l00448"></a>00448 <span class="keywordflow">if</span> (stream_.end() - it &lt; static_cast&lt;ptrdiff_t&gt;(prefix.size()))
+<a name="l00449"></a>00449 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00450"></a>00450 <span class="keywordflow">return</span> std::equal(prefix.begin(), prefix.end(), it);
+<a name="l00451"></a>00451 }
+<a name="l00452"></a>00452
+<a name="l00453"></a>00453 <span class="keyword">typedef</span> std::vector&lt;std::pair&lt;std::string, Token::Type&gt; &gt; TokenList;
+<a name="l00454"></a>00454 TokenList tokens;
+<a name="l00455"></a>00455
+<a name="l00456"></a>00456 <span class="keyword">const</span> std::string stream_;
+<a name="l00457"></a>00457 std::string::const_iterator pos;
+<a name="l00458"></a>00458 };
+<a name="l00459"></a>00459
+<a name="l00460"></a>00460
+<a name="l00461"></a>00461 <span class="keyword">class </span>XmlParser
+<a name="l00462"></a>00462 {
+<a name="l00463"></a>00463 <span class="keyword">public</span>:
+<a name="l00464"></a>00464 XmlParser(<span class="keyword">const</span> std::string&amp; stream) :
+<a name="l00465"></a>00465 scn(stream),
+<a name="l00466"></a>00466 tk(scn.nextToken()) {}
+<a name="l00467"></a>00467
+<a name="l00468"></a>00468 <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7" title="Load XML document from a byte stream.">parse</a>(XmlDoc&amp; doc) <span class="comment">//throw XmlParsingError</span>
+<a name="l00469"></a>00469 {
+<a name="l00470"></a>00470 <span class="comment">//declaration (optional)</span>
+<a name="l00471"></a>00471 <span class="keywordflow">if</span> (token().type == Token::TK_DECL_BEGIN)
+<a name="l00472"></a>00472 {
+<a name="l00473"></a>00473 nextToken();
+<a name="l00474"></a>00474
+<a name="l00475"></a>00475 <span class="keywordflow">while</span> (token().type == Token::TK_NAME)
+<a name="l00476"></a>00476 {
+<a name="l00477"></a>00477 std::string attribName = token().name;
+<a name="l00478"></a>00478 nextToken();
+<a name="l00479"></a>00479
+<a name="l00480"></a>00480 consumeToken(Token::TK_EQUAL);
+<a name="l00481"></a>00481 expectToken(Token::TK_QUOTE);
+<a name="l00482"></a>00482 std::string attribValue = scn.extractAttributeValue();
+<a name="l00483"></a>00483 nextToken();
+<a name="l00484"></a>00484
+<a name="l00485"></a>00485 consumeToken(Token::TK_QUOTE);
+<a name="l00486"></a>00486
+<a name="l00487"></a>00487 <span class="keywordflow">if</span> (attribName == <span class="stringliteral">&quot;version&quot;</span>)
+<a name="l00488"></a>00488 doc.setVersion(attribValue);
+<a name="l00489"></a>00489 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (attribName == <span class="stringliteral">&quot;encoding&quot;</span>)
+<a name="l00490"></a>00490 doc.setEncoding(attribValue);
+<a name="l00491"></a>00491 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (attribName == <span class="stringliteral">&quot;standalone&quot;</span>)
+<a name="l00492"></a>00492 doc.setStandalone(attribValue);
+<a name="l00493"></a>00493 }
+<a name="l00494"></a>00494 consumeToken(Token::TK_DECL_END);
+<a name="l00495"></a>00495 }
+<a name="l00496"></a>00496
+<a name="l00497"></a>00497 XmlDoc dummy;
+<a name="l00498"></a>00498 XmlElement&amp; elemTmp = dummy.root();
+<a name="l00499"></a>00499 parseChildElements(elemTmp);
+<a name="l00500"></a>00500
+<a name="l00501"></a>00501 <span class="keyword">auto</span> iterPair = elemTmp.getChildren();
+<a name="l00502"></a>00502 <span class="keywordflow">if</span> (iterPair.first != iterPair.second)
+<a name="l00503"></a>00503 doc.root().swap(*iterPair.first);
+<a name="l00504"></a>00504
+<a name="l00505"></a>00505 expectToken(Token::TK_END);
+<a name="l00506"></a>00506 };
+<a name="l00507"></a>00507
+<a name="l00508"></a>00508 <span class="keyword">private</span>:
+<a name="l00509"></a>00509 XmlParser(<span class="keyword">const</span> XmlParser&amp;);
+<a name="l00510"></a>00510 XmlParser&amp; operator=(<span class="keyword">const</span> XmlParser&amp;);
+<a name="l00511"></a>00511
+<a name="l00512"></a>00512 <span class="keywordtype">void</span> parseChildElements(XmlElement&amp; parent)
+<a name="l00513"></a>00513 {
+<a name="l00514"></a>00514 <span class="keywordflow">while</span> (token().type == Token::TK_LESS)
+<a name="l00515"></a>00515 {
+<a name="l00516"></a>00516 nextToken();
+<a name="l00517"></a>00517
+<a name="l00518"></a>00518 expectToken(Token::TK_NAME);
+<a name="l00519"></a>00519 std::string elementName = token().name;
+<a name="l00520"></a>00520 nextToken();
+<a name="l00521"></a>00521
+<a name="l00522"></a>00522 XmlElement&amp; newElement = parent.addChild(elementName);
+<a name="l00523"></a>00523
+<a name="l00524"></a>00524 parseAttributes(newElement);
+<a name="l00525"></a>00525
+<a name="l00526"></a>00526 <span class="keywordflow">if</span> (token().type == Token::TK_SLASH_GREATER) <span class="comment">//empty element</span>
+<a name="l00527"></a>00527 {
+<a name="l00528"></a>00528 nextToken();
+<a name="l00529"></a>00529 <span class="keywordflow">continue</span>;
+<a name="l00530"></a>00530 }
+<a name="l00531"></a>00531
+<a name="l00532"></a>00532 expectToken(Token::TK_GREATER);
+<a name="l00533"></a>00533 std::string elementValue = scn.extractElementValue();
+<a name="l00534"></a>00534 nextToken();
+<a name="l00535"></a>00535
+<a name="l00536"></a>00536 <span class="comment">//no support for mixed-mode content</span>
+<a name="l00537"></a>00537 <span class="keywordflow">if</span> (token().type == Token::TK_LESS) <span class="comment">//structured element</span>
+<a name="l00538"></a>00538 parseChildElements(newElement);
+<a name="l00539"></a>00539 <span class="keywordflow">else</span> <span class="comment">//value element</span>
+<a name="l00540"></a>00540 newElement.setValue(elementValue);
+<a name="l00541"></a>00541
+<a name="l00542"></a>00542 consumeToken(Token::TK_LESS_SLASH);
+<a name="l00543"></a>00543
+<a name="l00544"></a>00544 <span class="keywordflow">if</span> (token().type != Token::TK_NAME ||
+<a name="l00545"></a>00545 elementName != token().name)
+<a name="l00546"></a>00546 <span class="keywordflow">throw</span> XmlParsingError(scn.posRow(), scn.posCol());
+<a name="l00547"></a>00547 nextToken();
+<a name="l00548"></a>00548
+<a name="l00549"></a>00549 consumeToken(Token::TK_GREATER);
+<a name="l00550"></a>00550 }
+<a name="l00551"></a>00551 };
+<a name="l00552"></a>00552
+<a name="l00553"></a>00553 <span class="keywordtype">void</span> parseAttributes(XmlElement&amp; element)
+<a name="l00554"></a>00554 {
+<a name="l00555"></a>00555 <span class="keywordflow">while</span> (token().type == Token::TK_NAME)
+<a name="l00556"></a>00556 {
+<a name="l00557"></a>00557 std::string attribName = token().name;
+<a name="l00558"></a>00558 nextToken();
+<a name="l00559"></a>00559
+<a name="l00560"></a>00560 consumeToken(Token::TK_EQUAL);
+<a name="l00561"></a>00561 expectToken(Token::TK_QUOTE);
+<a name="l00562"></a>00562 std::string attribValue = scn.extractAttributeValue();
+<a name="l00563"></a>00563 nextToken();
+<a name="l00564"></a>00564
+<a name="l00565"></a>00565 consumeToken(Token::TK_QUOTE);
+<a name="l00566"></a>00566 element.setAttribute(attribName, attribValue);
+<a name="l00567"></a>00567 }
+<a name="l00568"></a>00568 }
+<a name="l00569"></a>00569
+<a name="l00570"></a>00570 <span class="keyword">const</span> Token&amp; token()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> tk; }
+<a name="l00571"></a>00571 <span class="keywordtype">void</span> nextToken() { tk = scn.nextToken(); }
+<a name="l00572"></a>00572
+<a name="l00573"></a>00573 <span class="keywordtype">void</span> consumeToken(Token::Type t) <span class="comment">//throw XmlParsingError</span>
+<a name="l00574"></a>00574 {
+<a name="l00575"></a>00575 expectToken(t); <span class="comment">//throw XmlParsingError</span>
+<a name="l00576"></a>00576 nextToken();
+<a name="l00577"></a>00577 }
+<a name="l00578"></a>00578
+<a name="l00579"></a>00579 <span class="keywordtype">void</span> expectToken(Token::Type t) <span class="comment">//throw XmlParsingError</span>
+<a name="l00580"></a>00580 {
+<a name="l00581"></a>00581 <span class="keywordflow">if</span> (token().type != t)
+<a name="l00582"></a>00582 <span class="keywordflow">throw</span> XmlParsingError(scn.posRow(), scn.posCol());
+<a name="l00583"></a>00583 }
+<a name="l00584"></a>00584
+<a name="l00585"></a>00585 Scanner scn;
+<a name="l00586"></a>00586 Token tk;
+<a name="l00587"></a>00587 };
+<a name="l00588"></a>00588 }
+<a name="l00589"></a>00589
+<a name="l00590"></a>00590 <span class="keyword">inline</span>
+<a name="l00591"></a><a class="code" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7">00591</a> <span class="keywordtype">void</span> <a class="code" href="namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7" title="Load XML document from a byte stream.">parse</a>(<span class="keyword">const</span> std::string&amp; stream, <a class="code" href="classzen_1_1_xml_doc.html" title="The complete XML document.">XmlDoc</a>&amp; doc) <span class="comment">//throw XmlParsingError</span>
+<a name="l00592"></a>00592 {
+<a name="l00593"></a>00593 implementation::XmlParser(stream).parse(doc); <span class="comment">//throw XmlParsingError</span>
+<a name="l00594"></a>00594 }
+<a name="l00595"></a>00595 }
+<a name="l00596"></a>00596
+<a name="l00597"></a>00597 <span class="preprocessor">#endif //ZEN_XML_PARSER_HEADER_81248670213764583021432</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/search/all_61.html b/zenxml/doc/search/all_61.html
new file mode 100644
index 00000000..a3164d55
--- /dev/null
+++ b/zenxml/doc/search/all_61.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_61.js b/zenxml/doc/search/all_61.js
new file mode 100644
index 00000000..2b7cd296
--- /dev/null
+++ b/zenxml/doc/search/all_61.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['addchild',['addChild',['../classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9',1,'zen::XmlElement']]],
+ ['attribute',['attribute',['../classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805',1,'zen::XmlOut::attribute()'],['../classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01',1,'zen::XmlIn::attribute()']]]
+];
diff --git a/zenxml/doc/search/all_63.html b/zenxml/doc/search/all_63.html
new file mode 100644
index 00000000..56b5ad1e
--- /dev/null
+++ b/zenxml/doc/search/all_63.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_63.js b/zenxml/doc/search/all_63.js
new file mode 100644
index 00000000..3c8f3573
--- /dev/null
+++ b/zenxml/doc/search/all_63.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['col',['col',['../structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd',1,'zen::XmlParsingError']]]
+];
diff --git a/zenxml/doc/search/all_65.html b/zenxml/doc/search/all_65.html
new file mode 100644
index 00000000..66cc8348
--- /dev/null
+++ b/zenxml/doc/search/all_65.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_65.js b/zenxml/doc/search/all_65.js
new file mode 100644
index 00000000..46ba186a
--- /dev/null
+++ b/zenxml/doc/search/all_65.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['errorsoccured',['errorsOccured',['../classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a',1,'zen::XmlIn']]]
+];
diff --git a/zenxml/doc/search/all_67.html b/zenxml/doc/search/all_67.html
new file mode 100644
index 00000000..41a459ae
--- /dev/null
+++ b/zenxml/doc/search/all_67.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_67.js b/zenxml/doc/search/all_67.js
new file mode 100644
index 00000000..029444b8
--- /dev/null
+++ b/zenxml/doc/search/all_67.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['get',['get',['../classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f',1,'zen::XmlIn']]],
+ ['getattribute',['getAttribute',['../classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887',1,'zen::XmlElement']]],
+ ['getchild',['getChild',['../classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e',1,'zen::XmlElement::getChild(const String &amp;name) const '],['../classzen_1_1_xml_element.html#a5d672e8ccc7592442ab927bb267af658',1,'zen::XmlElement::getChild(const String &amp;name)']]],
+ ['getchildren',['getChildren',['../classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8',1,'zen::XmlElement::getChildren(const String &amp;name) const '],['../classzen_1_1_xml_element.html#ae209dac9655bc36121abb87688ece41d',1,'zen::XmlElement::getChildren(const String &amp;name)'],['../classzen_1_1_xml_element.html#a55a6d1849490d82ae900cd9b923908f2',1,'zen::XmlElement::getChildren() const '],['../classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96',1,'zen::XmlElement::getChildren()']]],
+ ['getencodingas',['getEncodingAs',['../classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da',1,'zen::XmlDoc']]],
+ ['geterrorsas',['getErrorsAs',['../classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e',1,'zen::XmlIn']]],
+ ['getnameas',['getNameAs',['../classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50',1,'zen::XmlElement']]],
+ ['getstandaloneas',['getStandaloneAs',['../classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4',1,'zen::XmlDoc']]],
+ ['getvalue',['getValue',['../classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070',1,'zen::XmlElement']]],
+ ['getversionas',['getVersionAs',['../classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665',1,'zen::XmlDoc']]]
+];
diff --git a/zenxml/doc/search/all_6c.html b/zenxml/doc/search/all_6c.html
new file mode 100644
index 00000000..f6383cc2
--- /dev/null
+++ b/zenxml/doc/search/all_6c.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_6c.js b/zenxml/doc/search/all_6c.js
new file mode 100644
index 00000000..0e6b8f02
--- /dev/null
+++ b/zenxml/doc/search/all_6c.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['lasterror',['lastError',['../structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f',1,'zen::XmlFileError']]],
+ ['load',['load',['../namespacezen.html#a900c1fb290f0eedc24354c487145dbee',1,'zen']]],
+ ['loadstream',['loadStream',['../namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607',1,'zen']]]
+];
diff --git a/zenxml/doc/search/all_6e.html b/zenxml/doc/search/all_6e.html
new file mode 100644
index 00000000..1f92ee5b
--- /dev/null
+++ b/zenxml/doc/search/all_6e.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_6e.js b/zenxml/doc/search/all_6e.js
new file mode 100644
index 00000000..250e97da
--- /dev/null
+++ b/zenxml/doc/search/all_6e.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['next',['next',['../classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4',1,'zen::XmlIn']]]
+];
diff --git a/zenxml/doc/search/all_6f.html b/zenxml/doc/search/all_6f.html
new file mode 100644
index 00000000..61827e82
--- /dev/null
+++ b/zenxml/doc/search/all_6f.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_6f.js b/zenxml/doc/search/all_6f.js
new file mode 100644
index 00000000..4152ba50
--- /dev/null
+++ b/zenxml/doc/search/all_6f.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['_2a',['*',['../classzen_1_1_xml_in.html#a954950849b52557369932ab2a8b4ad72',1,'zen::XmlIn']]],
+ ['operator_28_29',['operator()',['../classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb',1,'zen::XmlOut::operator()()'],['../classzen_1_1_xml_in.html#a98cc59f687c89549381e76105f8fb506',1,'zen::XmlIn::operator()()']]],
+ ['operator_5b_5d',['operator[]',['../classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831',1,'zen::XmlOut::operator[]()'],['../classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d',1,'zen::XmlIn::operator[]()']]]
+];
diff --git a/zenxml/doc/search/all_70.html b/zenxml/doc/search/all_70.html
new file mode 100644
index 00000000..0340151b
--- /dev/null
+++ b/zenxml/doc/search/all_70.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_70.js b/zenxml/doc/search/all_70.js
new file mode 100644
index 00000000..b293cd99
--- /dev/null
+++ b/zenxml/doc/search/all_70.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['parent',['parent',['../classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1',1,'zen::XmlElement::parent()'],['../classzen_1_1_xml_element.html#a7ba1f26be5629f89ba7648d658f7058c',1,'zen::XmlElement::parent() const ']]],
+ ['parse',['parse',['../namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7',1,'zen']]]
+];
diff --git a/zenxml/doc/search/all_72.html b/zenxml/doc/search/all_72.html
new file mode 100644
index 00000000..0ab18d65
--- /dev/null
+++ b/zenxml/doc/search/all_72.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_72.js b/zenxml/doc/search/all_72.js
new file mode 100644
index 00000000..86fadf65
--- /dev/null
+++ b/zenxml/doc/search/all_72.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['readstruc',['readStruc',['../namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1',1,'zen']]],
+ ['readtext',['readText',['../namespacezen.html#acaf85ab94b61882f957afcd355386bff',1,'zen']]],
+ ['ref',['ref',['../classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2',1,'zen::XmlOut']]],
+ ['removeattribute',['removeAttribute',['../classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934',1,'zen::XmlElement']]],
+ ['root',['root',['../classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d',1,'zen::XmlDoc::root() const '],['../classzen_1_1_xml_doc.html#a094e156f9d265443e52a527638e88a1e',1,'zen::XmlDoc::root()']]],
+ ['row',['row',['../structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e',1,'zen::XmlParsingError']]]
+];
diff --git a/zenxml/doc/search/all_73.html b/zenxml/doc/search/all_73.html
new file mode 100644
index 00000000..1ec8f174
--- /dev/null
+++ b/zenxml/doc/search/all_73.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_73.js b/zenxml/doc/search/all_73.js
new file mode 100644
index 00000000..a062befe
--- /dev/null
+++ b/zenxml/doc/search/all_73.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['save',['save',['../namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d',1,'zen']]],
+ ['savestream',['saveStream',['../namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2',1,'zen']]],
+ ['serialize',['serialize',['../namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee',1,'zen']]],
+ ['setattribute',['setAttribute',['../classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421',1,'zen::XmlElement']]],
+ ['setencoding',['setEncoding',['../classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62',1,'zen::XmlDoc']]],
+ ['setstandalone',['setStandalone',['../classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4',1,'zen::XmlDoc']]],
+ ['setvalue',['setValue',['../classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01',1,'zen::XmlElement']]],
+ ['setversion',['setVersion',['../classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64',1,'zen::XmlDoc']]]
+];
diff --git a/zenxml/doc/search/all_77.html b/zenxml/doc/search/all_77.html
new file mode 100644
index 00000000..73323d31
--- /dev/null
+++ b/zenxml/doc/search/all_77.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_77.js b/zenxml/doc/search/all_77.js
new file mode 100644
index 00000000..5e349623
--- /dev/null
+++ b/zenxml/doc/search/all_77.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['writestruc',['writeStruc',['../namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6',1,'zen']]],
+ ['writetext',['writeText',['../namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f',1,'zen']]]
+];
diff --git a/zenxml/doc/search/all_78.html b/zenxml/doc/search/all_78.html
new file mode 100644
index 00000000..10780d66
--- /dev/null
+++ b/zenxml/doc/search/all_78.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_78.js b/zenxml/doc/search/all_78.js
new file mode 100644
index 00000000..371f5dde
--- /dev/null
+++ b/zenxml/doc/search/all_78.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['xmldoc',['XmlDoc',['../classzen_1_1_xml_doc.html',1,'zen']]],
+ ['xmldoc',['XmlDoc',['../classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed',1,'zen::XmlDoc::XmlDoc()'],['../classzen_1_1_xml_doc.html#a74ff8434848672fe6483845d04c082df',1,'zen::XmlDoc::XmlDoc(String rootName)']]],
+ ['xmlelement',['XmlElement',['../classzen_1_1_xml_element.html',1,'zen']]],
+ ['xmlerror',['XmlError',['../structzen_1_1_xml_error.html',1,'zen']]],
+ ['xmlfileerror',['XmlFileError',['../structzen_1_1_xml_file_error.html',1,'zen']]],
+ ['xmlin',['XmlIn',['../classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f',1,'zen::XmlIn::XmlIn(const XmlDoc &amp;doc)'],['../classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430',1,'zen::XmlIn::XmlIn(const XmlElement *element)'],['../classzen_1_1_xml_in.html#a33de75412df69cb25e0fd8b3bc70c9f8',1,'zen::XmlIn::XmlIn(const XmlElement &amp;element)']]],
+ ['xmlin',['XmlIn',['../classzen_1_1_xml_in.html',1,'zen']]],
+ ['xmlout',['XmlOut',['../classzen_1_1_xml_out.html',1,'zen']]],
+ ['xmlout',['XmlOut',['../classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc',1,'zen::XmlOut::XmlOut(XmlDoc &amp;doc)'],['../classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0',1,'zen::XmlOut::XmlOut(XmlElement &amp;element)']]],
+ ['xmlparsingerror',['XmlParsingError',['../structzen_1_1_xml_parsing_error.html',1,'zen']]]
+];
diff --git a/zenxml/doc/search/all_7a.html b/zenxml/doc/search/all_7a.html
new file mode 100644
index 00000000..0593a62d
--- /dev/null
+++ b/zenxml/doc/search/all_7a.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/all_7a.js b/zenxml/doc/search/all_7a.js
new file mode 100644
index 00000000..14074229
--- /dev/null
+++ b/zenxml/doc/search/all_7a.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['zen',['zen',['../namespacezen.html',1,'']]]
+];
diff --git a/zenxml/doc/search/classes_78.html b/zenxml/doc/search/classes_78.html
new file mode 100644
index 00000000..dfce8ecc
--- /dev/null
+++ b/zenxml/doc/search/classes_78.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/classes_78.js b/zenxml/doc/search/classes_78.js
new file mode 100644
index 00000000..fa78dcd3
--- /dev/null
+++ b/zenxml/doc/search/classes_78.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['xmldoc',['XmlDoc',['../classzen_1_1_xml_doc.html',1,'zen']]],
+ ['xmlelement',['XmlElement',['../classzen_1_1_xml_element.html',1,'zen']]],
+ ['xmlerror',['XmlError',['../structzen_1_1_xml_error.html',1,'zen']]],
+ ['xmlfileerror',['XmlFileError',['../structzen_1_1_xml_file_error.html',1,'zen']]],
+ ['xmlin',['XmlIn',['../classzen_1_1_xml_in.html',1,'zen']]],
+ ['xmlout',['XmlOut',['../classzen_1_1_xml_out.html',1,'zen']]],
+ ['xmlparsingerror',['XmlParsingError',['../structzen_1_1_xml_parsing_error.html',1,'zen']]]
+];
diff --git a/zenxml/doc/search/close.png b/zenxml/doc/search/close.png
new file mode 100644
index 00000000..9342d3df
--- /dev/null
+++ b/zenxml/doc/search/close.png
Binary files differ
diff --git a/zenxml/doc/search/functions_61.html b/zenxml/doc/search/functions_61.html
new file mode 100644
index 00000000..7f395337
--- /dev/null
+++ b/zenxml/doc/search/functions_61.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_61.js b/zenxml/doc/search/functions_61.js
new file mode 100644
index 00000000..2b7cd296
--- /dev/null
+++ b/zenxml/doc/search/functions_61.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['addchild',['addChild',['../classzen_1_1_xml_element.html#a653caffa6fad89db7d14f67f987ad0f9',1,'zen::XmlElement']]],
+ ['attribute',['attribute',['../classzen_1_1_xml_out.html#acaf9b71fe1d907dd63dd4b91e2e03805',1,'zen::XmlOut::attribute()'],['../classzen_1_1_xml_in.html#a971cd7054c551c4460d5220f6ec5cf01',1,'zen::XmlIn::attribute()']]]
+];
diff --git a/zenxml/doc/search/functions_65.html b/zenxml/doc/search/functions_65.html
new file mode 100644
index 00000000..a77debae
--- /dev/null
+++ b/zenxml/doc/search/functions_65.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_65.js b/zenxml/doc/search/functions_65.js
new file mode 100644
index 00000000..46ba186a
--- /dev/null
+++ b/zenxml/doc/search/functions_65.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['errorsoccured',['errorsOccured',['../classzen_1_1_xml_in.html#a33b5dd504d3165aa3f923f6b33e9991a',1,'zen::XmlIn']]]
+];
diff --git a/zenxml/doc/search/functions_67.html b/zenxml/doc/search/functions_67.html
new file mode 100644
index 00000000..d0ab42a3
--- /dev/null
+++ b/zenxml/doc/search/functions_67.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_67.js b/zenxml/doc/search/functions_67.js
new file mode 100644
index 00000000..029444b8
--- /dev/null
+++ b/zenxml/doc/search/functions_67.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['get',['get',['../classzen_1_1_xml_in.html#a647b468b7c6c95b25f2e43627184177f',1,'zen::XmlIn']]],
+ ['getattribute',['getAttribute',['../classzen_1_1_xml_element.html#af90ac6f435b03ba37cf47ee188c58887',1,'zen::XmlElement']]],
+ ['getchild',['getChild',['../classzen_1_1_xml_element.html#a3ab82b1720460487f4afabcd115d0c7e',1,'zen::XmlElement::getChild(const String &amp;name) const '],['../classzen_1_1_xml_element.html#a5d672e8ccc7592442ab927bb267af658',1,'zen::XmlElement::getChild(const String &amp;name)']]],
+ ['getchildren',['getChildren',['../classzen_1_1_xml_element.html#a2640b438c4984f5eeb8760d82d73c5b8',1,'zen::XmlElement::getChildren(const String &amp;name) const '],['../classzen_1_1_xml_element.html#ae209dac9655bc36121abb87688ece41d',1,'zen::XmlElement::getChildren(const String &amp;name)'],['../classzen_1_1_xml_element.html#a55a6d1849490d82ae900cd9b923908f2',1,'zen::XmlElement::getChildren() const '],['../classzen_1_1_xml_element.html#ac59268177d162931f937b6a7f235ad96',1,'zen::XmlElement::getChildren()']]],
+ ['getencodingas',['getEncodingAs',['../classzen_1_1_xml_doc.html#a64ece4a1f3f8c802192b8f31506535da',1,'zen::XmlDoc']]],
+ ['geterrorsas',['getErrorsAs',['../classzen_1_1_xml_in.html#a84bb497d3b3fc753d054e52c4823c05e',1,'zen::XmlIn']]],
+ ['getnameas',['getNameAs',['../classzen_1_1_xml_element.html#a7c911eb06a59c864197b1a4098728e50',1,'zen::XmlElement']]],
+ ['getstandaloneas',['getStandaloneAs',['../classzen_1_1_xml_doc.html#ac1bfb9776852dc8195b9ffb4f65452e4',1,'zen::XmlDoc']]],
+ ['getvalue',['getValue',['../classzen_1_1_xml_element.html#a5ac9d586a5668c2c64e3c06c6203b070',1,'zen::XmlElement']]],
+ ['getversionas',['getVersionAs',['../classzen_1_1_xml_doc.html#a7f93dcdc00cdc8d98926cf8e47161665',1,'zen::XmlDoc']]]
+];
diff --git a/zenxml/doc/search/functions_6c.html b/zenxml/doc/search/functions_6c.html
new file mode 100644
index 00000000..da371cfa
--- /dev/null
+++ b/zenxml/doc/search/functions_6c.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_6c.js b/zenxml/doc/search/functions_6c.js
new file mode 100644
index 00000000..93c6b2bd
--- /dev/null
+++ b/zenxml/doc/search/functions_6c.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['load',['load',['../namespacezen.html#a900c1fb290f0eedc24354c487145dbee',1,'zen']]],
+ ['loadstream',['loadStream',['../namespacezen.html#a04fe23c3bd9b7d03309620b5ea763607',1,'zen']]]
+];
diff --git a/zenxml/doc/search/functions_6e.html b/zenxml/doc/search/functions_6e.html
new file mode 100644
index 00000000..d734dd07
--- /dev/null
+++ b/zenxml/doc/search/functions_6e.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_6e.js b/zenxml/doc/search/functions_6e.js
new file mode 100644
index 00000000..250e97da
--- /dev/null
+++ b/zenxml/doc/search/functions_6e.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['next',['next',['../classzen_1_1_xml_in.html#a60cf2678c989621545d27745dcafa4a4',1,'zen::XmlIn']]]
+];
diff --git a/zenxml/doc/search/functions_6f.html b/zenxml/doc/search/functions_6f.html
new file mode 100644
index 00000000..222f0f83
--- /dev/null
+++ b/zenxml/doc/search/functions_6f.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_6f.js b/zenxml/doc/search/functions_6f.js
new file mode 100644
index 00000000..4152ba50
--- /dev/null
+++ b/zenxml/doc/search/functions_6f.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['_2a',['*',['../classzen_1_1_xml_in.html#a954950849b52557369932ab2a8b4ad72',1,'zen::XmlIn']]],
+ ['operator_28_29',['operator()',['../classzen_1_1_xml_out.html#a09ca9144515e3c109b36062b0475c8eb',1,'zen::XmlOut::operator()()'],['../classzen_1_1_xml_in.html#a98cc59f687c89549381e76105f8fb506',1,'zen::XmlIn::operator()()']]],
+ ['operator_5b_5d',['operator[]',['../classzen_1_1_xml_out.html#a00f883d3f9d60535b06b5ae609dc8831',1,'zen::XmlOut::operator[]()'],['../classzen_1_1_xml_in.html#a9b38167835a28eac9a2297f35f51e53d',1,'zen::XmlIn::operator[]()']]]
+];
diff --git a/zenxml/doc/search/functions_70.html b/zenxml/doc/search/functions_70.html
new file mode 100644
index 00000000..c62125ed
--- /dev/null
+++ b/zenxml/doc/search/functions_70.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_70.js b/zenxml/doc/search/functions_70.js
new file mode 100644
index 00000000..b293cd99
--- /dev/null
+++ b/zenxml/doc/search/functions_70.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['parent',['parent',['../classzen_1_1_xml_element.html#a4af309f59ef09f46a559f1f0e1eac6c1',1,'zen::XmlElement::parent()'],['../classzen_1_1_xml_element.html#a7ba1f26be5629f89ba7648d658f7058c',1,'zen::XmlElement::parent() const ']]],
+ ['parse',['parse',['../namespacezen.html#a6cf1ec0b57fc1ae9aa95761800e67ec7',1,'zen']]]
+];
diff --git a/zenxml/doc/search/functions_72.html b/zenxml/doc/search/functions_72.html
new file mode 100644
index 00000000..a4336f7c
--- /dev/null
+++ b/zenxml/doc/search/functions_72.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_72.js b/zenxml/doc/search/functions_72.js
new file mode 100644
index 00000000..86b2b142
--- /dev/null
+++ b/zenxml/doc/search/functions_72.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['readstruc',['readStruc',['../namespacezen.html#a2bdcecfe7435ef11cedbce47d4e72ee1',1,'zen']]],
+ ['readtext',['readText',['../namespacezen.html#acaf85ab94b61882f957afcd355386bff',1,'zen']]],
+ ['ref',['ref',['../classzen_1_1_xml_out.html#aec117344e8a534382e8d5e76711f97b2',1,'zen::XmlOut']]],
+ ['removeattribute',['removeAttribute',['../classzen_1_1_xml_element.html#ad9c2ce2e55294c8110825988595e3934',1,'zen::XmlElement']]],
+ ['root',['root',['../classzen_1_1_xml_doc.html#ad4a9594d93885fc1a12db28e8246648d',1,'zen::XmlDoc::root() const '],['../classzen_1_1_xml_doc.html#a094e156f9d265443e52a527638e88a1e',1,'zen::XmlDoc::root()']]]
+];
diff --git a/zenxml/doc/search/functions_73.html b/zenxml/doc/search/functions_73.html
new file mode 100644
index 00000000..774d577f
--- /dev/null
+++ b/zenxml/doc/search/functions_73.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_73.js b/zenxml/doc/search/functions_73.js
new file mode 100644
index 00000000..a062befe
--- /dev/null
+++ b/zenxml/doc/search/functions_73.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['save',['save',['../namespacezen.html#adeeb6b2318097382ae47aa939fc15d4d',1,'zen']]],
+ ['savestream',['saveStream',['../namespacezen.html#a4ba7bbaa14a787b07fc13da9145aabe2',1,'zen']]],
+ ['serialize',['serialize',['../namespacezen.html#afaa4920e275078e6c8009fbdf58b57ee',1,'zen']]],
+ ['setattribute',['setAttribute',['../classzen_1_1_xml_element.html#a211a6f037c22a54d3facb7a8347a8421',1,'zen::XmlElement']]],
+ ['setencoding',['setEncoding',['../classzen_1_1_xml_doc.html#a2ae30bca2f490479f58c272148935a62',1,'zen::XmlDoc']]],
+ ['setstandalone',['setStandalone',['../classzen_1_1_xml_doc.html#a4c92f9b8c1bb47247b827d89794590d4',1,'zen::XmlDoc']]],
+ ['setvalue',['setValue',['../classzen_1_1_xml_element.html#aaf3a26f6199fc88cce7d9d911ba21b01',1,'zen::XmlElement']]],
+ ['setversion',['setVersion',['../classzen_1_1_xml_doc.html#ab45914339c476e1da35746f5e00dbc64',1,'zen::XmlDoc']]]
+];
diff --git a/zenxml/doc/search/functions_77.html b/zenxml/doc/search/functions_77.html
new file mode 100644
index 00000000..8fe97554
--- /dev/null
+++ b/zenxml/doc/search/functions_77.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_77.js b/zenxml/doc/search/functions_77.js
new file mode 100644
index 00000000..5e349623
--- /dev/null
+++ b/zenxml/doc/search/functions_77.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['writestruc',['writeStruc',['../namespacezen.html#a29ddb823fe0a195f19a64448881b8bf6',1,'zen']]],
+ ['writetext',['writeText',['../namespacezen.html#a2ce2998296871fc2f4718ceceb22a23f',1,'zen']]]
+];
diff --git a/zenxml/doc/search/functions_78.html b/zenxml/doc/search/functions_78.html
new file mode 100644
index 00000000..2b33d25e
--- /dev/null
+++ b/zenxml/doc/search/functions_78.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/functions_78.js b/zenxml/doc/search/functions_78.js
new file mode 100644
index 00000000..b9817184
--- /dev/null
+++ b/zenxml/doc/search/functions_78.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['xmldoc',['XmlDoc',['../classzen_1_1_xml_doc.html#adbed9c31066d456a9cc8c610f15670ed',1,'zen::XmlDoc::XmlDoc()'],['../classzen_1_1_xml_doc.html#a74ff8434848672fe6483845d04c082df',1,'zen::XmlDoc::XmlDoc(String rootName)']]],
+ ['xmlin',['XmlIn',['../classzen_1_1_xml_in.html#a5b48c9848e6c631a04cec2477ff85c0f',1,'zen::XmlIn::XmlIn(const XmlDoc &amp;doc)'],['../classzen_1_1_xml_in.html#ae072660cde71fd4695c04d074098b430',1,'zen::XmlIn::XmlIn(const XmlElement *element)'],['../classzen_1_1_xml_in.html#a33de75412df69cb25e0fd8b3bc70c9f8',1,'zen::XmlIn::XmlIn(const XmlElement &amp;element)']]],
+ ['xmlout',['XmlOut',['../classzen_1_1_xml_out.html#ad8b1ccb8f3d4e7b0ab2598597ea50bcc',1,'zen::XmlOut::XmlOut(XmlDoc &amp;doc)'],['../classzen_1_1_xml_out.html#aa80be3a56f70a58d2730a763166088c0',1,'zen::XmlOut::XmlOut(XmlElement &amp;element)']]]
+];
diff --git a/zenxml/doc/search/mag_sel.png b/zenxml/doc/search/mag_sel.png
new file mode 100644
index 00000000..81f6040a
--- /dev/null
+++ b/zenxml/doc/search/mag_sel.png
Binary files differ
diff --git a/zenxml/doc/search/namespaces_7a.html b/zenxml/doc/search/namespaces_7a.html
new file mode 100644
index 00000000..c8f3629d
--- /dev/null
+++ b/zenxml/doc/search/namespaces_7a.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/namespaces_7a.js b/zenxml/doc/search/namespaces_7a.js
new file mode 100644
index 00000000..14074229
--- /dev/null
+++ b/zenxml/doc/search/namespaces_7a.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['zen',['zen',['../namespacezen.html',1,'']]]
+];
diff --git a/zenxml/doc/search/nomatches.html b/zenxml/doc/search/nomatches.html
new file mode 100644
index 00000000..b1ded27e
--- /dev/null
+++ b/zenxml/doc/search/nomatches.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/search.css b/zenxml/doc/search/search.css
new file mode 100644
index 00000000..d18c1da8
--- /dev/null
+++ b/zenxml/doc/search/search.css
@@ -0,0 +1,238 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+ float: left;
+}
+
+#MSearchBox {
+ white-space : nowrap;
+ position: absolute;
+ float: none;
+ display: inline;
+ margin-top: 8px;
+ right: 0px;
+ width: 170px;
+ z-index: 102;
+ background-color: white;
+}
+
+#MSearchBox .left
+{
+ display:block;
+ position:absolute;
+ left:10px;
+ width:20px;
+ height:19px;
+ background:url('search_l.png') no-repeat;
+ background-position:right;
+}
+
+#MSearchSelect {
+ display:block;
+ position:absolute;
+ width:20px;
+ height:19px;
+}
+
+.left #MSearchSelect {
+ left:4px;
+}
+
+.right #MSearchSelect {
+ right:5px;
+}
+
+#MSearchField {
+ display:block;
+ position:absolute;
+ height:19px;
+ background:url('search_m.png') repeat-x;
+ border:none;
+ width:116px;
+ margin-left:20px;
+ padding-left:4px;
+ color: #909090;
+ outline: none;
+ font: 9pt Arial, Verdana, sans-serif;
+}
+
+#FSearchBox #MSearchField {
+ margin-left:15px;
+}
+
+#MSearchBox .right {
+ display:block;
+ position:absolute;
+ right:10px;
+ top:0px;
+ width:20px;
+ height:19px;
+ background:url('search_r.png') no-repeat;
+ background-position:left;
+}
+
+#MSearchClose {
+ display: none;
+ position: absolute;
+ top: 4px;
+ background : none;
+ border: none;
+ margin: 0px 4px 0px 0px;
+ padding: 0px 0px;
+ outline: none;
+}
+
+.left #MSearchClose {
+ left: 6px;
+}
+
+.right #MSearchClose {
+ right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #90A5CE;
+ background-color: #F9FAFC;
+ z-index: 1;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: #3D578C;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ width: 60ex;
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: #EEF1F7;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+}
+
+.SRResult {
+ display: none;
+}
+
+DIV.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
diff --git a/zenxml/doc/search/search.js b/zenxml/doc/search/search.js
new file mode 100644
index 00000000..e2269bf9
--- /dev/null
+++ b/zenxml/doc/search/search.js
@@ -0,0 +1,803 @@
+// Search script generated by doxygen
+// Copyright (C) 2009 by Dimitri van Heesch.
+
+// The code in this file is loosly based on main.js, part of Natural Docs,
+// which is Copyright (C) 2003-2008 Greg Valure
+// Natural Docs is licensed under the GPL.
+
+var indexSectionsWithContent =
+{
+ 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010100001011101100011010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010100001011101100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
+};
+
+var indexSectionNames =
+{
+ 0: "all",
+ 1: "classes",
+ 2: "namespaces",
+ 3: "functions",
+ 4: "variables"
+};
+
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i<search.length;i++)
+ {
+ var c = search.charAt(i);
+ var cn = c.charCodeAt(0);
+ if (c.match(/[a-z0-9]/))
+ {
+ result+=c;
+ }
+ else if (cn<16)
+ {
+ result+="_0"+cn.toString(16);
+ }
+ else
+ {
+ result+="_"+cn.toString(16);
+ }
+ }
+ return result;
+}
+
+function getXPos(item)
+{
+ var x = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ x += item.offsetLeft;
+ item = item.offsetParent;
+ }
+ }
+ return x;
+}
+
+function getYPos(item)
+{
+ var y = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ y += item.offsetTop;
+ item = item.offsetParent;
+ }
+ }
+ return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+ Parameters:
+ name - The name of the global variable that will be
+ storing this instance. Is needed to be able to set timeouts.
+ resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+ if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+
+ // ---------- Instance variables
+ this.name = name;
+ this.resultsPath = resultsPath;
+ this.keyTimeout = 0;
+ this.keyTimeoutLength = 500;
+ this.closeSelectionTimeout = 300;
+ this.lastSearchValue = "";
+ this.lastResultsPage = "";
+ this.hideTimeout = 0;
+ this.searchIndex = 0;
+ this.searchActive = false;
+ this.insideFrame = inFrame;
+ this.searchLabel = label;
+
+ // ----------- DOM Elements
+
+ this.DOMSearchField = function()
+ { return document.getElementById("MSearchField"); }
+
+ this.DOMSearchSelect = function()
+ { return document.getElementById("MSearchSelect"); }
+
+ this.DOMSearchSelectWindow = function()
+ { return document.getElementById("MSearchSelectWindow"); }
+
+ this.DOMPopupSearchResults = function()
+ { return document.getElementById("MSearchResults"); }
+
+ this.DOMPopupSearchResultsWindow = function()
+ { return document.getElementById("MSearchResultsWindow"); }
+
+ this.DOMSearchClose = function()
+ { return document.getElementById("MSearchClose"); }
+
+ this.DOMSearchBox = function()
+ { return document.getElementById("MSearchBox"); }
+
+ // ------------ Event Handlers
+
+ // Called when focus is added or removed from the search field.
+ this.OnSearchFieldFocus = function(isActive)
+ {
+ this.Activate(isActive);
+ }
+
+ this.OnSearchSelectShow = function()
+ {
+ var searchSelectWindow = this.DOMSearchSelectWindow();
+ var searchField = this.DOMSearchSelect();
+
+ if (this.insideFrame)
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ left += searchField.offsetWidth + 6;
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ left -= searchSelectWindow.offsetWidth;
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+ else
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+
+ // stop selection hide timer
+ if (this.hideTimeout)
+ {
+ clearTimeout(this.hideTimeout);
+ this.hideTimeout=0;
+ }
+ return false; // to avoid "image drag" default event
+ }
+
+ this.OnSearchSelectHide = function()
+ {
+ this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+ this.closeSelectionTimeout);
+ }
+
+ // Called when the content of the search field is changed.
+ this.OnSearchFieldChange = function(evt)
+ {
+ if (this.keyTimeout) // kill running timer
+ {
+ clearTimeout(this.keyTimeout);
+ this.keyTimeout = 0;
+ }
+
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 || e.keyCode==13)
+ {
+ if (e.shiftKey==1)
+ {
+ this.OnSearchSelectShow();
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ child.focus();
+ return;
+ }
+ }
+ return;
+ }
+ else if (window.frames.MSearchResults.searchResults)
+ {
+ var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+ }
+ else if (e.keyCode==27) // Escape out of the search field
+ {
+ this.DOMSearchField().blur();
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ this.Activate(false);
+ return;
+ }
+
+ // strip whitespaces
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+ if (searchValue != this.lastSearchValue) // search value has changed
+ {
+ if (searchValue != "") // non-empty search
+ {
+ // set timer for search update
+ this.keyTimeout = setTimeout(this.name + '.Search()',
+ this.keyTimeoutLength);
+ }
+ else // empty search field
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ }
+ }
+ }
+
+ this.SelectItemCount = function(id)
+ {
+ var count=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ this.SelectItemSet = function(id)
+ {
+ var i,j=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ var node = child.firstChild;
+ if (j==id)
+ {
+ node.innerHTML='&#8226;';
+ }
+ else
+ {
+ node.innerHTML='&#160;';
+ }
+ j++;
+ }
+ }
+ }
+
+ // Called when an search filter selection is made.
+ // set item with index id as the active item
+ this.OnSelectItem = function(id)
+ {
+ this.searchIndex = id;
+ this.SelectItemSet(id);
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+ if (searchValue!="" && this.searchActive) // something was found -> do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+ {
+ this.searchIndex++;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==38 && this.searchIndex>0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var hexCode;
+ if (code<16)
+ {
+ hexCode="0"+code.toString(16);
+ }
+ else
+ {
+ hexCode=code.toString(16);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
+ {
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches.html';
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline';
+ if (this.insideFrame)
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ domPopupSearchResultsWindow.style.position = 'relative';
+ domPopupSearchResultsWindow.style.display = 'block';
+ var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResults.style.width = width + 'px';
+ }
+ else
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ }
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of <Search()>.
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName == 'DIV' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+ var results = document.getElementById("SRResults");
+ for (var e=0; e<searchData.length; e++)
+ {
+ var id = searchData[e][0];
+ var srResult = document.createElement('div');
+ srResult.setAttribute('id','SR_'+id);
+ setClassAttr(srResult,'SRResult');
+ var srEntry = document.createElement('div');
+ setClassAttr(srEntry,'SREntry');
+ var srLink = document.createElement('a');
+ srLink.setAttribute('id','Item'+e);
+ setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+ setClassAttr(srLink,'SRSymbol');
+ srLink.innerHTML = searchData[e][1][0];
+ srEntry.appendChild(srLink);
+ if (searchData[e][1].length==2) // single result
+ {
+ srLink.setAttribute('href',searchData[e][1][1][0]);
+ if (searchData[e][1][1][1])
+ {
+ srLink.setAttribute('target','_parent');
+ }
+ var srScope = document.createElement('span');
+ setClassAttr(srScope,'SRScope');
+ srScope.innerHTML = searchData[e][1][1][2];
+ srEntry.appendChild(srScope);
+ }
+ else // multiple results
+ {
+ srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+ var srChildren = document.createElement('div');
+ setClassAttr(srChildren,'SRChildren');
+ for (var c=0; c<searchData[e][1].length-1; c++)
+ {
+ var srChild = document.createElement('a');
+ srChild.setAttribute('id','Item'+e+'_c'+c);
+ setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+ setClassAttr(srChild,'SRScope');
+ srChild.setAttribute('href',searchData[e][1][c+1][0]);
+ if (searchData[e][1][c+1][1])
+ {
+ srChild.setAttribute('target','_parent');
+ }
+ srChild.innerHTML = searchData[e][1][c+1][2];
+ srChildren.appendChild(srChild);
+ }
+ srEntry.appendChild(srChildren);
+ }
+ srResult.appendChild(srEntry);
+ results.appendChild(srResult);
+ }
+}
+
diff --git a/zenxml/doc/search/search_l.png b/zenxml/doc/search/search_l.png
new file mode 100644
index 00000000..c872f4da
--- /dev/null
+++ b/zenxml/doc/search/search_l.png
Binary files differ
diff --git a/zenxml/doc/search/search_m.png b/zenxml/doc/search/search_m.png
new file mode 100644
index 00000000..b429a16b
--- /dev/null
+++ b/zenxml/doc/search/search_m.png
Binary files differ
diff --git a/zenxml/doc/search/search_r.png b/zenxml/doc/search/search_r.png
new file mode 100644
index 00000000..97ee8b43
--- /dev/null
+++ b/zenxml/doc/search/search_r.png
Binary files differ
diff --git a/zenxml/doc/search/variables_63.html b/zenxml/doc/search/variables_63.html
new file mode 100644
index 00000000..c649c81f
--- /dev/null
+++ b/zenxml/doc/search/variables_63.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/variables_63.js b/zenxml/doc/search/variables_63.js
new file mode 100644
index 00000000..3c8f3573
--- /dev/null
+++ b/zenxml/doc/search/variables_63.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['col',['col',['../structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd',1,'zen::XmlParsingError']]]
+];
diff --git a/zenxml/doc/search/variables_6c.html b/zenxml/doc/search/variables_6c.html
new file mode 100644
index 00000000..6016f5cc
--- /dev/null
+++ b/zenxml/doc/search/variables_6c.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/variables_6c.js b/zenxml/doc/search/variables_6c.js
new file mode 100644
index 00000000..e2e327ad
--- /dev/null
+++ b/zenxml/doc/search/variables_6c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['lasterror',['lastError',['../structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f',1,'zen::XmlFileError']]]
+];
diff --git a/zenxml/doc/search/variables_72.html b/zenxml/doc/search/variables_72.html
new file mode 100644
index 00000000..29b87f04
--- /dev/null
+++ b/zenxml/doc/search/variables_72.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/zenxml/doc/search/variables_72.js b/zenxml/doc/search/variables_72.js
new file mode 100644
index 00000000..f37305dd
--- /dev/null
+++ b/zenxml/doc/search/variables_72.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['row',['row',['../structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e',1,'zen::XmlParsingError']]]
+];
diff --git a/zenxml/doc/structzen_1_1_xml_error-members.html b/zenxml/doc/structzen_1_1_xml_error-members.html
new file mode 100644
index 00000000..cc906ffc
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_error-members.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Member List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="structzen_1_1_xml_error.html">XmlError</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlError Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="structzen_1_1_xml_error.html">zen::XmlError</a>, including all inherited members.<table>
+</table></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/structzen_1_1_xml_error.html b/zenxml/doc/structzen_1_1_xml_error.html
new file mode 100644
index 00000000..d089d6ee
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_error.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen::XmlError Struct Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="structzen_1_1_xml_error.html">XmlError</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlError Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Exception base class for zen::Xml.
+ <a href="structzen_1_1_xml_error.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="error_8h_source.html">error.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for zen::XmlError:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="structzen_1_1_xml_error.png" usemap="#zen::XmlError_map" alt=""/>
+ <map id="zen::XmlError_map" name="zen::XmlError_map">
+<area href="structzen_1_1_xml_file_error.html" title="Exception thrown due to failed file I/O." alt="zen::XmlFileError" shape="rect" coords="0,56,132,80"/>
+<area href="structzen_1_1_xml_parsing_error.html" title="Exception thrown due to an XML parsing error." alt="zen::XmlParsingError" shape="rect" coords="142,56,274,80"/>
+</map>
+ </div></div>
+
+<p><a href="structzen_1_1_xml_error-members.html">List of all members.</a></p>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Exception base class for zen::Xml. </p>
+</div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/structzen_1_1_xml_error.png b/zenxml/doc/structzen_1_1_xml_error.png
new file mode 100644
index 00000000..0fc21923
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_error.png
Binary files differ
diff --git a/zenxml/doc/structzen_1_1_xml_file_error-members.html b/zenxml/doc/structzen_1_1_xml_file_error-members.html
new file mode 100644
index 00000000..53a1115a
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_file_error-members.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Member List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="structzen_1_1_xml_file_error.html">XmlFileError</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlFileError Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="structzen_1_1_xml_file_error.html">zen::XmlFileError</a>, including all inherited members.<table>
+ <tr class="memlist"><td><a class="el" href="structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f">lastError</a></td><td><a class="el" href="structzen_1_1_xml_file_error.html">zen::XmlFileError</a></td><td></td></tr>
+</table></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/structzen_1_1_xml_file_error.html b/zenxml/doc/structzen_1_1_xml_file_error.html
new file mode 100644
index 00000000..c7e54c33
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_file_error.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen::XmlFileError Struct Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="structzen_1_1_xml_file_error.html">XmlFileError</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> </div>
+ <div class="headertitle">
+<div class="title">zen::XmlFileError Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Exception thrown due to failed file I/O.
+ <a href="structzen_1_1_xml_file_error.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="io_8h_source.html">io.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for zen::XmlFileError:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="structzen_1_1_xml_file_error.png" usemap="#zen::XmlFileError_map" alt=""/>
+ <map id="zen::XmlFileError_map" name="zen::XmlFileError_map">
+<area href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml." alt="zen::XmlError" shape="rect" coords="0,0,110,24"/>
+</map>
+ </div></div>
+
+<p><a href="structzen_1_1_xml_file_error-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a4a109e749675a3887af8cfc140303b8f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4a109e749675a3887af8cfc140303b8f"></a>
+ErrorCode&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzen_1_1_xml_file_error.html#a4a109e749675a3887af8cfc140303b8f">lastError</a></td></tr>
+<tr class="memdesc:a4a109e749675a3887af8cfc140303b8f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Native error code: errno. <br/></td></tr>
+</table>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Exception thrown due to failed file I/O. </p>
+</div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/structzen_1_1_xml_file_error.png b/zenxml/doc/structzen_1_1_xml_file_error.png
new file mode 100644
index 00000000..6393414f
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_file_error.png
Binary files differ
diff --git a/zenxml/doc/structzen_1_1_xml_parsing_error-members.html b/zenxml/doc/structzen_1_1_xml_parsing_error-members.html
new file mode 100644
index 00000000..acc507ae
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_parsing_error-members.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: Member List</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="structzen_1_1_xml_parsing_error.html">XmlParsingError</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="headertitle">
+<div class="title">zen::XmlParsingError Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+This is the complete list of members for <a class="el" href="structzen_1_1_xml_parsing_error.html">zen::XmlParsingError</a>, including all inherited members.<table>
+ <tr class="memlist"><td><a class="el" href="structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd">col</a></td><td><a class="el" href="structzen_1_1_xml_parsing_error.html">zen::XmlParsingError</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e">row</a></td><td><a class="el" href="structzen_1_1_xml_parsing_error.html">zen::XmlParsingError</a></td><td></td></tr>
+</table></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/structzen_1_1_xml_parsing_error.html b/zenxml/doc/structzen_1_1_xml_parsing_error.html
new file mode 100644
index 00000000..bece27d7
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_parsing_error.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: zen::XmlParsingError Struct Reference</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+ <div id="nav-path" class="navpath">
+ <ul>
+ <li class="navelem"><a class="el" href="namespacezen.html">zen</a> </li>
+ <li class="navelem"><a class="el" href="structzen_1_1_xml_parsing_error.html">XmlParsingError</a> </li>
+ </ul>
+ </div>
+</div>
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> </div>
+ <div class="headertitle">
+<div class="title">zen::XmlParsingError Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Exception thrown due to an XML parsing error.
+ <a href="structzen_1_1_xml_parsing_error.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="parser_8h_source.html">parser.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for zen::XmlParsingError:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="structzen_1_1_xml_parsing_error.png" usemap="#zen::XmlParsingError_map" alt=""/>
+ <map id="zen::XmlParsingError_map" name="zen::XmlParsingError_map">
+<area href="structzen_1_1_xml_error.html" title="Exception base class for zen::Xml." alt="zen::XmlError" shape="rect" coords="0,0,132,24"/>
+</map>
+ </div></div>
+
+<p><a href="structzen_1_1_xml_parsing_error-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a3ed4cd1b5599df9b52500f620421496e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3ed4cd1b5599df9b52500f620421496e"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzen_1_1_xml_parsing_error.html#a3ed4cd1b5599df9b52500f620421496e">row</a></td></tr>
+<tr class="memdesc:a3ed4cd1b5599df9b52500f620421496e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Input file row where the parsing error occured (zero-based) <br/></td></tr>
+<tr class="memitem:a4a37dc48883337499804a9dc791669fd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4a37dc48883337499804a9dc791669fd"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structzen_1_1_xml_parsing_error.html#a4a37dc48883337499804a9dc791669fd">col</a></td></tr>
+<tr class="memdesc:a4a37dc48883337499804a9dc791669fd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Input file column where the parsing error occured (zero-based) <br/></td></tr>
+</table>
+<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
+<div class="textblock"><p>Exception thrown due to an XML parsing error. </p>
+</div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/doc/structzen_1_1_xml_parsing_error.png b/zenxml/doc/structzen_1_1_xml_parsing_error.png
new file mode 100644
index 00000000..f0eb8f79
--- /dev/null
+++ b/zenxml/doc/structzen_1_1_xml_parsing_error.png
Binary files differ
diff --git a/zenxml/doc/tab_a.png b/zenxml/doc/tab_a.png
new file mode 100644
index 00000000..2d99ef23
--- /dev/null
+++ b/zenxml/doc/tab_a.png
Binary files differ
diff --git a/zenxml/doc/tab_b.png b/zenxml/doc/tab_b.png
new file mode 100644
index 00000000..b2c3d2be
--- /dev/null
+++ b/zenxml/doc/tab_b.png
Binary files differ
diff --git a/zenxml/doc/tab_h.png b/zenxml/doc/tab_h.png
new file mode 100644
index 00000000..c11f48f1
--- /dev/null
+++ b/zenxml/doc/tab_h.png
Binary files differ
diff --git a/zenxml/doc/tab_s.png b/zenxml/doc/tab_s.png
new file mode 100644
index 00000000..978943ac
--- /dev/null
+++ b/zenxml/doc/tab_s.png
Binary files differ
diff --git a/zenxml/doc/tabs.css b/zenxml/doc/tabs.css
new file mode 100644
index 00000000..21920562
--- /dev/null
+++ b/zenxml/doc/tabs.css
@@ -0,0 +1,59 @@
+.tabs, .tabs2, .tabs3 {
+ background-image: url('tab_b.png');
+ width: 100%;
+ z-index: 101;
+ font-size: 13px;
+}
+
+.tabs2 {
+ font-size: 10px;
+}
+.tabs3 {
+ font-size: 9px;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: url('tab_b.png');
+ line-height: 36px;
+ list-style: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 20px;
+ font-weight: bold;
+ background-image:url('tab_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #283A5D;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+ outline: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+}
+
+.tablist a:hover {
+ background-image: url('tab_h.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-decoration: none;
+}
+
+.tablist li.current a {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
diff --git a/zenxml/doc/xml_8h_source.html b/zenxml/doc/xml_8h_source.html
new file mode 100644
index 00000000..ecdce60a
--- /dev/null
+++ b/zenxml/doc/xml_8h_source.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<title>zen::Xml: xml.h Source File</title>
+
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+
+</head>
+<body>
+<div id="top"><!-- do not remove this div! -->
+
+
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+
+ <td id="projectlogo"><img alt="Logo" src="zenXml.png"/></td>
+
+
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">zen::Xml
+
+ </div>
+ <div id="projectbrief">Simple C++ XML Processing</div>
+ </td>
+
+
+
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<!-- Generated by Doxygen 1.8.0 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ </ul>
+ </div>
+</div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">xml.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// **************************************************************************</span>
+<a name="l00002"></a>00002 <span class="comment">// * This file is part of the zen::Xml project. It is distributed under the *</span>
+<a name="l00003"></a>00003 <span class="comment">// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *</span>
+<a name="l00004"></a>00004 <span class="comment">// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *</span>
+<a name="l00005"></a>00005 <span class="comment">// **************************************************************************</span>
+<a name="l00006"></a>00006
+<a name="l00007"></a>00007 <span class="preprocessor">#ifndef ZEN_XML_HEADER_349578228034572457454554</span>
+<a name="l00008"></a>00008 <span class="preprocessor"></span><span class="preprocessor">#define ZEN_XML_HEADER_349578228034572457454554</span>
+<a name="l00009"></a>00009 <span class="preprocessor"></span>
+<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;bind.h&quot;</span>
+<a name="l00011"></a>00011
+<a name="l00013"></a>00013 <span class="keyword">namespace </span>zen {}
+<a name="l00014"></a>00014
+<a name="l00015"></a>00015 <span class="preprocessor">#endif //ZEN_XML_HEADER_349578228034572457454554</span>
+</pre></div></div><!-- contents -->
+
+
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.0
+</small></address>
+
+</body>
+</html>
diff --git a/zenxml/summary.dox b/zenxml/summary.dox
deleted file mode 100644
index abe0537d..00000000
--- a/zenxml/summary.dox
+++ /dev/null
@@ -1,684 +0,0 @@
-// **************************************************************************
-// * This file is part of the zen::Xml project. It is distributed under the *
-// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt *
-// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
-// **************************************************************************
-
-/**
-\mainpage Overview
-
-\li \ref sec_Rationale
-\li \ref sec_Quick_Start
-\li \ref sec_Supported_Platforms
-\li \ref sec_Flexible_Programming_Model
-\li \ref sec_Structured_XML_element_access
-\li \ref sec_Access_XML_attributes
-\li \ref sec_Automatic_conversion_built_in
-\li \ref sec_Automatic_conversion_string
-\li \ref sec_Automatic_conversion_STL
-\li \ref sec_Support_user_defined
-\li \ref sec_Structured_user_types
-\li \ref sec_Type_Safety
-
-\section sec_Rationale Rationale
-
-zen::Xml is an XML library serializing structured user data in a convenient way.
-Using compile-time information gathered by techniques of template metaprogramming it minimizes the manual overhead required and frees the user from implementing fundamental type conversions
-by himself. Basic data types such as
-- \b all built-in arithmetic numbers,
-- \b all kinds of string classes and "string-like" types,
-- \b all types defined as STL containers
-
-are handled automatically. Thereby a large number of recurring problems is solved by the library:
-- generic number to string conversions
-- generic char to wchar_t conversions (UTF) for custom string classes in a platform independent manner
-- serialization of arbitrary STL container types
-- simple integration: header-only, no extra dependencies, fully portable
-- support arbitrary string classes everywhere: for file names, XML element names, attribute names, values, ...
-- XML library built on C++11 with focus on elegance, minimal code size, flexibility and performance
-- easily extensible API: allow for internationalization, fine-granular error handling, and custom file I/O
-
-The design follows the philosophy of the Loki library: \n
-http://loki-lib.sourceforge.net/index.php?n=Main.Philosophy
-
-\section sec_Quick_Start Quick Start
-
-1. Download zen::Xml: http://sourceforge.net/projects/zenxml
-
-2. Setup one of the following preprocessor macros for your project to identify the platform (this is only required if you use C-stream-based file IO)
-\code
- ZEN_WIN
- ZEN_LINUX
- ZEN_MAC
-\endcode
-
-3. For optimal performance define this global macro in release build: (following convention of the <tt>assert</tt> macro)
-\code
- NDEBUG
-\endcode
-
-4. Include the main header:
-\code
-#include <zenxml/xml.h>
-\endcode
-
-5. Start serializing user data:
-
-\code
-size_t a = 10;
-double b = 2.0;
-int c = -1;
-\endcode
-
-\code
-zen::XmlDoc doc; //empty XML document
-
-zen::XmlOut out(doc); //the simplest way to fill the document is to use a data output proxy
-out["elem1"](a); //
-out["elem2"](b); //map data types to XML elements
-out["elem3"](c); //
-
-try
-{
- save(doc, "file.xml"); //throw zen::XmlFileError
-}
-catch (const zen::XmlFileError& e) { /* handle error */ }
-\endcode
-
-The following XML file will be created:
-\verbatim
-<?xml version="1.0" encoding="UTF-8"?>
-<Root>
- <elem1>10</elem1>
- <elem2>2.000000</elem2>
- <elem3>-1</elem3>
-</Root>
-\endverbatim
-
-Load an XML file and map its content to user data:
-\code
-zen::XmlDoc doc; //empty XML document
-
-try
-{
- load("file.xml", doc); //throw XmlFileError, XmlParsingError
-}
-catch (const zen::XmlError& e) { /* handle error */ }
-
-zen::XmlIn in(doc); //the simplest way to read the document is to use a data input proxy
-in["elem1"](a); //
-in["elem2"](b); //map XML elements into user data
-in["elem3"](c); //
-
-//check for mapping errors, i.e. missing elements or conversion errors: you may consider these as warnings only
-if (in.errorsOccured())
-{
- std::vector<std::wstring> failedElements = in.getErrorsAs<std::wstring>();
- /* generate error message showing the XML element names that failed to convert */
-}
-\endcode
-
-
-\section sec_Supported_Platforms Supported Platforms
-
-zen::Xml is written in a platform independent manner and runs on any rudimentary C++11 compliant compiler.
-It has been tested successfully under:
-
-- Windows:
- -# Visual C++ 2010 - 32 bit
- -# Visual C++ 2010 - 64 bit
- -# MinGW: GCC 4.5.2 - 32 bit
-
-- Linux:
- -# GCC 4.5.2 - 32 bit
- -# GCC 4.5.2 - 64 bit
-
-- Mac OS X:
- -# Clang 3.2 - 64 bit
-
-<b>Note:</b> In order to enable C++11 features in GCC it is required to specify either of the following compiler options:
-\verbatim
--std=c++11
--std=c++0x
--std=gnu++0x
-\endverbatim
-
-
-\section sec_Flexible_Programming_Model Flexible Programming Model
-
-Depending on what granularity of control is required in a particular application, zen::Xml allows the user to choose between full control or simplicity.
-\n\n
-The library is structured into the following parts, each of which can be used in isolation:
-\n\n
-\b \<File\> \n
-|\n
-| io.h\n
-|\n
-<b>\<Byte Stream\></b>\n
-|\n
-| parser.h\n
-|\n
-<b>\<Document Object Model\></b>\n
-|\n
-| bind.h\n
-|\n
-<b>\<C++ user data\></b>
-\n\n
-
-- Save an XML document to memory
-\code
-zen::XmlDoc doc;
- ... //fill it
-std::string stream = serialize(doc); //throw ()
-/* you now have a binary XML stream */
-
-saveStream(stream, "file.xml"); //throw XmlFileError
-//if all you need is to store XmlDoc in a file direcly you can use zen::save() instead
-\endcode
-
-- Load XML document from memory
-\code
-//get XML byte stream:
-std::string stream = loadStream("file.xml"); //throw XmlFileError
-
-zen::XmlDoc doc;
-//parse byte stream into an XML document:
-parse(stream, doc); //throw XmlParsingError
-//if all you need is to load an XmlDoc from a file you can use zen::load() directly
-\endcode
-
-- Fine-granular error checking with the data input proxy
-\code
-zen::XmlIn in(doc);
-//map XML elements into user data
-if (!in["elem1"](a))
- throw MyCustomException();
-if (!in["elem2"](b))
- throw MyCustomException();
-if (!in["elem3"](c))
- throw MyCustomException();
-
-//if (in.errorsOccured()) ... <- not required here: contains the same conversion errors checked manually before
-\endcode
-
-- Access the Document Object Model directly (without input/output proxy)
-\n\n
-The full power of type conversions which is available via the input/output proxy classes zen::XmlIn and zen::XmlOut is also available for the document object model!
-\code
-using namespace zen;
-
-XmlDoc doc;
-
-XmlElement& child = doc.root().addChild("elem1");
-child.setValue(1234);
-
-save(doc, "file.xml"); //throw XmlFileError
-\endcode
-\n
-\code
-using namespace zen;
-
-XmlDoc doc;
-load("file.xml", doc); //throw XmlFileError, XmlParsingError
-
-XmlElement* child = doc.root().getChild("elem1");
-if (child)
-{
- int value = -1;
- if (!child->getValue(value))
- ... //handle conversion error
-}
-else
- ... //XML element not found
-\endcode
-
-
-\section sec_Structured_XML_element_access Structured XML element access
-
-\code
-//write a value into one deeply nested XML element - note the different types used seamlessly: char[], wchar_t[], char, wchar_t, int
-zen::XmlOut out(doc);
-out["elemento1"][L"элемент2"][L"要素3"][L"στοιχείο4"]["elem5"][L"元素6"][L'元']['z'](-1234);
-\endcode
-
-The resulting XML:
-\verbatim
-<?xml version="1.0" encoding="UTF-8"?>
-<Root>
- <elemento1>
- <элемент2>
- <要素3>
- <στοιχείο4>
- <elem5>
- <元素6>
- <元>
- <z>-1234</z>
- </元>
- </元素6>
- </elem5>
- </στοιχείο4>
- </要素3>
- </элемент2>
- </elemento1>
-</Root>
-\endverbatim
-
-
-\section sec_Access_XML_attributes Access XML attributes
-
-\code
-zen::XmlDoc doc;
-
-zen::XmlOut out(doc);
-out["elem"].attribute("attr1", -1); //
-out["elem"].attribute("attr2", 2.1); //write data into XML attributes
-out["elem"].attribute("attr3", true); //
-
-save(doc, "file.xml"); //throw XmlFileError
-\endcode
-
-The resulting XML:
-\verbatim
-<?xml version="1.0" encoding="UTF-8"?>
-<Root>
- <elem attr1="-1" attr2="2.1" attr3="true"/>
-</Root>
-\endverbatim
-
-
-\section sec_Automatic_conversion_built_in Automatic conversion for built-in arithmetic types
-
-All built-in arithmetic types and <tt>bool</tt> are detected at compile time and a proper conversion is applied.
-Common conversions for integer-like types such as <tt>int</tt>, <tt>long</tt>, <tt>long long</tt>, ect. as well as floating point types are optimized for maximum performance.
-
-\code
-zen::XmlOut out(doc);
-
-out["int"] (-1234);
-out["double"](1.23);
-out["float"] (4.56f);
-out["ulong"] (1234UL);
-out["bool"] (false);
-\endcode
-
-The resulting XML:
-\verbatim
-<?xml version="1.0" encoding="UTF-8"?>
-<Root>
- <int>-1234</int>
- <double>1.23</double>
- <float>4.56</float>
- <ulong>1234</ulong>
- <bool>false</bool>
-</Root>
-\endverbatim
-
-
-\section sec_Automatic_conversion_string Automatic conversion for string-like types
-
-The document object model of zen::Xml internally stores all names and values as a std::string. Consequently everything that is not a std::string but is "string-like" is UTF-converted
-into a std::string representation. By default zen::Xml accepts all character arrays like <tt>char[]</tt>, <tt>wchar_t[]</tt>, <tt>char*</tt>, <tt>wchar_t*</tt>, single characters like
-<tt>char</tt>, <tt>wchar_t</tt>, standard string classes like <tt>std::string</tt>, <tt>std::wstring</tt> and user-defined string classes.
-If the input string is based on <tt>char</tt>, it will simply be copied and thereby preserves any local encodings. If the input string is based on <tt>wchar_t</tt> it will
-be converted to an UTF-8 encoded <tt>std::string</tt>. The correct <tt>wchar_t</tt> encoding of the system will be detected at compile time, for example UTF-16 on Windows,
-UTF-32 on most Linux distributions.
-
-<b>Note:</b> User-defined string classes are automatically supported if they fulfill the following <b>string concept</b> by defining:
- -# A typedef named <tt>value_type</tt> for the underlying character type: must be \p char or \p wchar_t
- -# A member function <tt>c_str()</tt> returning something that can be converted into a <tt>const value_type*</tt>
- -# A member function <tt>length()</tt> returning the number of characters returned by <tt>c_str()</tt>
-
-\code
-std::string elem1 = "elemento1";
-std::wstring elem2 = L"элемент2";
-wxString elem3 = L"要素3";
-MyString elem4 = L"στοιχείο4";
-
-zen::XmlOut out(doc);
-
-out["string"] (elem1);
-out["wstring"] (elem2);
-out["wxString"] (elem3);
-out["MyString"] (elem4);
-out["char[6]"] ("elem5");
-out["wchar_t[4]"](L"元素6");
-out["wchar_t"] (L'元');
-out["char"] ('z');
-\endcode
-
-The resulting XML:
-\verbatim
-<?xml version="1.0" encoding="UTF-8"?>
-<Root>
- <string>elemento1</string>
- <wstring>элемент2</wstring>
- <wxString>要素3</wxString>
- <MyString>στοιχείο4</MyString>
- <char[6]>elem5</char[6]>
- <wchar_t[4]>元素6</wchar_t[4]>
- <wchar_t>元</wchar_t>
- <char>z</char>
-</Root>
-\endverbatim
-
-
-\section sec_Automatic_conversion_STL Automatic conversion for STL container types
-
-- User-defined STL compatible types are automatically supported if they fulfill the following <b>container concept</b> by defining:
- -# A typedef named <tt>value_type</tt> for the underlying element type of the container
- -# A typedef named <tt>iterator</tt> for a non-const iterator into the container
- -# A typedef named <tt>const_iterator</tt> for a const iterator into the container
-\n\n
- -# A member function <tt>begin()</tt> returning an iterator pointing to the first element in the container
- -# A member function <tt>end()</tt> returning an iterator pointing just after the last element in the container
- -# A member function <tt>insert()</tt> with the signature <tt>iterator insert(iterator position, const value_type& x)</tt>
- -# A member function <tt>clear()</tt> removing all elements from the container
-
-- In order to support combinations of user types and STL containers such as <tt>std::vector<MyType></tt> or <tt>std::vector<std::list<MyType>></tt> it is sufficient to
-only integrate <tt>MyType</tt> into zen::Xml. \n
-See \ref sec_Support_user_defined
-
-\code
-std::deque <float> testDeque;
-std::list <size_t> testList;
-std::map <double, char> testMap;
-std::multimap<short, double> testMultiMap;
-std::set <int> testSet;
-std::multiset<std::string> testMultiSet;
-std::vector <wchar_t> testVector;
-std::vector <std::list<wchar_t>> testVectorList;
-std::pair <char, wchar_t> testPair;
-
-/* fill container */
-
-zen::XmlOut out(doc);
-
-out["deque"] (testDeque);
-out["list"] (testList);
-out["map"] (testMap);
-out["multimap"] (testMultiMap);
-out["set"] (testSet);
-out["multiset"] (testMultiSet);
-out["vector"] (testVector);
-out["vect_list"](testVectorList);
-out["pair" ] (testPair);
-\endcode
-
-The resulting XML:
-\verbatim
-<?xml version="1.0" encoding="UTF-8"?>
-<Root>
- <deque>
- <Item>1.234</Item>
- <Item>5.678</Item>
- </deque>
- <list>
- <Item>1</Item>
- <Item>2</Item>
- </list>
- <map>
- <Item>
- <one>1.1</one>
- <two>a</two>
- </Item>
- <Item>
- <one>2.2</one>
- <two>b</two>
- </Item>
- </map>
- <multimap>
- <Item>
- <one>3</one>
- <two>99</two>
- </Item>
- <Item>
- <one>3</one>
- <two>100</two>
- </Item>
- <Item>
- <one>4</one>
- <two>101</two>
- </Item>
- </multimap>
- <set>
- <Item>1</Item>
- <Item>2</Item>
- </set>
- <multiset>
- <Item>1</Item>
- <Item>1</Item>
- <Item>2</Item>
- </multiset>
- <vector>
- <Item>Ä</Item>
- <Item>Ö</Item>
- </vector>
- <vect_list>
- <Item>
- <Item>ä</Item>
- <Item>ö</Item>
- <Item>ü</Item>
- </Item>
- <Item>
- <Item>ä</Item>
- <Item>ö</Item>
- <Item>ü</Item>
- </Item>
- </vect_list>
- <pair>
- <one>a</one>
- <two>â</two>
- </pair>
-</Root>
-\endverbatim
-
-
-\section sec_Support_user_defined Support for user-defined types
-
-User types can be integrated into zen::Xml by providing specializations of zen::readText() and zen::writeText() or zen::readStruc() and zen::writeStruc().
-The first pair should be used for all non-structured types that can be represented as a simple text string. This specialization is then used to convert the type to XML elements
-and XML attributes. The second pair should be specialized for structured types that require an XML representation as a hierarchy of elements. This specialization is used when converting
-the type to XML elements only.
-\n\n
-See section \ref sec_Type_Safety for a discussion of type categories.
-\n\n
-<b>Example: Specialization for an enum type</b>
-\code
-enum UnitTime
-{
- UNIT_SECOND,
- UNIT_MINUTE,
- UNIT_HOUR
-};
-
-namespace zen
-{
-template <> inline
-void writeText(const UnitTime& value, std::string& output)
-{
- switch (value)
- {
- case UNIT_SECOND: output = "second"; break;
- case UNIT_MINUTE: output = "minute"; break;
- case UNIT_HOUR: output = "hour" ; break;
- }
-}
-
-template <> inline
-bool readText(const std::string& input, UnitTime& value)
-{
- std::string tmp = input;
- zen::trim(tmp);
- if (tmp == "second")
- value = UNIT_SECOND;
- else if (tmp == "minute")
- value = UNIT_MINUTE;
- else if (tmp == "hour")
- value = UNIT_HOUR;
- else
- return false;
- return true;
-}
-}
-\endcode
-
-<b>Example: Brute-force specialization for an enum type</b>
-\code
-namespace zen
-{
-template <> inline
-void writeText(const EnumType& value, std::string& output)
-{
- output = zen::numberTo<std::string>(static_cast<int>(value)); //treat enum like an integer
-}
-
-template <> inline
-bool readText(const std::string& input, EnumType& value)
-{
- value = static_cast<EnumType>(zen::stringTo<int>(input)); //treat enum like an integer
- return true;
-}
-}
-\endcode
-
-<b>Example: Specialization for a structured user type</b>
-\code
-struct Config
-{
- int a;
- std::wstring b;
-};
-
-namespace zen
-{
-template <> inline
-void writeStruc(const Config& value, XmlElement& output)
-{
- XmlOut out(output);
- out["number" ](value.a);
- out["address"](value.b);
-}
-
-template <> inline
-bool readStruc(const XmlElement& input, Config& value)
-{
- XmlIn in(input);
- bool rv1 = in["number" ](value.a);
- bool rv2 = in["address"](value.b);
- return rv1 && rv2;
-}
-}
-
-int main()
-{
- Config cfg = { 2, L"Abc 3" };
-
- std::vector<Config> cfgList;
- cfgList.push_back(cfg);
-
- zen::XmlDoc doc;
- zen::XmlOut out(doc); //write to Xml via output proxy
- out["config"](cfgList);
- save(doc, "file.xml"); //throw XmlFileError
-}
-\endcode
-
-The resulting XML:
-\verbatim
-<?xml version="1.0" encoding="UTF-8"?>
-<Root>
- <config>
- <Item>
- <number>2</number>
- <address>Abc 3</address>
- </Item>
- </config>
-</Root>
-\endverbatim
-
-
-\section sec_Structured_user_types Structured user types
-
-Although it is possible to enable conversion of structured user types by specializing zen::readStruc() and zen::writeStruc() (see \ref sec_Support_user_defined),
-this approach has one drawback: If a mapping error occurs when converting an XML element to structured user data, for example a child-element is missing,
-the input proxy class zen::XmlIn is only able to detect that the whole conversion failed. It cannot say which child-elements in particular failed to convert.
-\n\n
-Therefore it may be appropriate to convert structured types by calling subroutines in order to enable fine-granular logging:
-
-\code
-void readConfig(const zen::XmlIn& in, Config& cfg)
-{
- in["number" ](value.a); //failed conversions will now be logged for each single item by XmlIn
- in["address"](value.b); //instead of only once for the complete Config type!
-}
-
-
-void loadConfig(const wxString& filename, Config& cfg)
-{
- zen::XmlDoc doc; //empty XML document
-
- try
- {
- load(filename, doc); //throw XmlFileError, XmlParsingError
- }
- catch (const zen::XmlError& e) { /* handle error */ }
-
- zen::XmlIn in(doc);
-
- zen::XmlIn inConfig = in["config"]; //get input proxy for child element "config"
-
- readConfig(inConfig, cfg); //map child element to user data by calling subroutine
-
- //check for mapping errors: errors occuring in subroutines are considered, too!
- if (in.errorsOccured())
- /* show mapping errors */
-}
-\endcode
-
-
-\section sec_Type_Safety Type Safety
-
-zen::Xml heavily uses methods of compile-time introspection in order to free the user from managing basic type conversions by himself.
-Thereby it is important to find the right balance between automatic conversions and type safety so that program correctness is not compromised.
-In the context of XML processing three fundamental type categories can be recognized:
-
-- <b>string-like types</b>: <tt>std::string, wchar_t*, char[], wchar_t, wxString, MyStringClass, ...</tt>
-- <b>to-string-convertible types</b>: any string-like type, all built-in arithmetic numbers, <tt>bool</tt>
-- <b>structured types</b>: any to-string-convertible type, STL containers, <tt>std::pair</tt>, structured user types
-
-These categories can be seen as a sequence of inclusive sets:
-\verbatim
------------------------------
-| structured | Used as: XML element value
-| ------------------------- | Conversion via: readStruc(), writeStruc() - may be specialized for user-defined types!
-| | to-string-convertible | | Used as: XML element/attribute value
-| | --------------- | | Conversion via: readText(), writeText() - may be specialized for user-defined types!
-| | | string-like | | | Used as: XML element/attribute value or element name
-| | --------------- | | Conversion via: utfCvrtTo<>()
-| ------------------------- |
------------------------------
-\endverbatim
-
-A practical implication of this design is that conversions that do not make sense in a particular context simply lead to compile-time errors:
-\code
-zen::XmlOut out(doc);
-out[L'Z'](someValue); //fine: a wchar_t is acceptable as an element name
-out[1234](someValue); //compiler error: an integer is NOT "string-like"!
-\endcode
-\n
-\code
-int i = 0;
-std::vector<int> v;
-
-zen::XmlOut out(doc);
-out["elem1"](i); //fine: both i and v can be converted to an XML element
-out["elem2"](v); //
-
-out["elem"].attribute("attr1", i); //fine: an integer can be converted to an XML attribute
-out["elem"].attribute("attr2", v); //compiler error: a std::vector<int> is NOT "to-string-convertible"!
-\endcode
-
- \author \b Zenju
- \n\n
- <b>Email:</b> zenju AT gmx DOT de
-*/ \ No newline at end of file
diff --git a/zenxml/bind.h b/zenxml/zenxml/bind.h
index abeff452..abeff452 100644
--- a/zenxml/bind.h
+++ b/zenxml/zenxml/bind.h
diff --git a/zenxml/cvrt_struc.h b/zenxml/zenxml/cvrt_struc.h
index 690edacb..690edacb 100644
--- a/zenxml/cvrt_struc.h
+++ b/zenxml/zenxml/cvrt_struc.h
diff --git a/zenxml/cvrt_text.h b/zenxml/zenxml/cvrt_text.h
index 80664317..80664317 100644
--- a/zenxml/cvrt_text.h
+++ b/zenxml/zenxml/cvrt_text.h
diff --git a/zenxml/dom.h b/zenxml/zenxml/dom.h
index a2ed78f7..a2ed78f7 100644
--- a/zenxml/dom.h
+++ b/zenxml/zenxml/dom.h
diff --git a/zenxml/error.h b/zenxml/zenxml/error.h
index bea04520..bea04520 100644
--- a/zenxml/error.h
+++ b/zenxml/zenxml/error.h
diff --git a/zenxml/io.h b/zenxml/zenxml/io.h
index 596d7acf..596d7acf 100644
--- a/zenxml/io.h
+++ b/zenxml/zenxml/io.h
diff --git a/zenxml/parser.h b/zenxml/zenxml/parser.h
index 51779852..51779852 100644
--- a/zenxml/parser.h
+++ b/zenxml/zenxml/parser.h
diff --git a/zenxml/unit_test.cpp b/zenxml/zenxml/unit_test.cpp
index 8f49de6f..8f49de6f 100644
--- a/zenxml/unit_test.cpp
+++ b/zenxml/zenxml/unit_test.cpp
diff --git a/zenxml/xml.h b/zenxml/zenxml/xml.h
index 3a01b1a1..3a01b1a1 100644
--- a/zenxml/xml.h
+++ b/zenxml/zenxml/xml.h
bgstack15